日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

谈一谈:抽象工厂+反射+配置文件 实现数据访问程序

發布時間:2025/6/15 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 谈一谈:抽象工厂+反射+配置文件 实现数据访问程序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

??《大話設計模式》中第15章中《就不能不換DB嗎?》引出了我今天要談論的主題:抽象工廠+反射+配置文件 實現數據訪問程序。當時也不甚理解啊!到了機房收費的親身實踐中,終于體會到了這對組合的奧秘。


抽象工廠模式(Abstract Factory)

提供一個創建一系列相關或相互依賴對象的接口,而無需制定它們具體的類。知道它是用來創建工廠的就OK了。

反射

提供了封裝程序集、模塊和類型的對象。這里僅僅用到反射的一部分功能。且記住它的格式: ?

Assembly.Load(“程序集名稱”?.?CreateInstance(“命名空間?.?類名稱”)

配置文件?

存在于UI層,名字為App.config ,在程序打包發布后,仍可以從安裝包中找到該文件并加以更改。(其它不再贅述)


按照大鳥的思路,這種組合寫法就能夠方便的更改DB,在程序需要更改數據庫時不需要重新返工,只需要從配置文件中,把數據庫的名字更改一下就Ok了。我把大鳥的思路寫一下。(《大話》中的代碼是用C#語言寫的,而我是在vb.net 版的機房收費系統中理順思路的,所以以下代碼均為vb.net 代碼,大同小異)

Factory 中 DataAccess類

[vb]?view plaincopy
  • <span?style="font-size:18px;">Imports?System.Configuration????'添加對配置文件的引用,配置文件命名空間????
  • Imports?System.Reflection???????'添加對反射的引用???
  • Public?Class?DataAccess??
  • ????'通過配置文件獲取D層程序集的名稱和命名空間的名稱(一般情況下相同):DAL????
  • ????Dim?AssemblyName?As?String?=?System.Configuration.ConfigurationManager.AppSettings("assName")??
  • ????'數據庫類型為:Sqlserver????
  • ????Dim?db?As?String?=?System.Configuration.ConfigurationManager.AppSettings("DB")??
  • ????'創建D層類SqlUserInfoDAL的實例????
  • ????Public?Function?CreateUserInfo()?As?IDAL.IUserInfo??
  • ????????Dim?dalUserInfoName?As?String?=?AssemblyName?&?"."?&?db?&?"UserInfoDAL"????????'聲明要實例化的D層類的名稱????
  • ????????Return?CType(Assembly.Load(AssemblyName).CreateInstance(dalUserInfoName),?IUserInfo)??
  • ????End?Function??
  • End?Class</span>??
  • 配置文件中添加

    [plain]?view plaincopy
  • <span?style="font-size:18px;">??????<appSettings>???
  • ??????????<add?key?="assName"?value?="DAL"/>??
  • ??????????<add?key?="DB"?value?="Sqlserver"/>??
  • ??????</appSettings></span>??

  • ? ? ? ? 如果需要更改數據庫比如說要把Sqlserver 更改為Access即可 (這就要求我們在D層建類時,嚴格命名,把Sql里的類名前面應該是Sqlserver開頭,Access數據庫時類名應該用Access開頭。)如下圖:



    但是我在敲這一部分時,是這樣寫的(最初的最初,我沒有想著要給系統更換數據庫,所以某些變量和方法命名時沒有考慮把數據庫的選擇表達出來)

    Factory 中 DataAccess類

    [vb]?view plaincopy
  • <span?style="font-size:18px;">Imports?System.Reflection????'添加對反射的引用??
  • Imports?System.Configuration??'添加對配置文件的引用??
  • Public?Class?DataAccess??
  • ????Dim?strDALName?As?String?=?System.Configuration.ConfigurationSettings.AppSettings("DALName")??'定義一個字符串strDALName,通過配置文件獲取D層程序集的名稱和命名空間的名稱(一般情況下相同)并賦值給所聲明的變量strDALName??
  • ??
  • ????'?創建一個用戶User接口,并把對應的類名稱關聯上??
  • ????Public?Function?CreateIUser()?As?IDAL.IUser??
  • ????????'通過配置文件和反射,實例化接口并能夠通過更改配置文件的內容更改?實例化D層的程序集和命名空間下的類??
  • ????????Return?CType(Assembly.Load(strDALName).CreateInstance(strDALName?+?"."?+?"UserDAL"),?IDAL.IUser)??
  • ????End?Function??
  • ????'?創建一個學生信息StudentInfo接口,并把對應類名稱關聯上??
  • ????Function?CreateIStudent()?As?IDAL.IStudentInfo??
  • ????????Return?CType(Assembly.Load(strDALName).CreateInstance(strDALName?+?"."?+?"StudentInfoDAL"),?IDAL.IStudentInfo)??
  • ????End?Function??
  • End?Class</span>??

  • 配置文件中這樣寫的

    [plain]?view plaincopy
  • <span?style="font-size:18px;"><?xml?version="1.0"?encoding="utf-8"??>??
  • <configuration>??
  • ??????
  • ??????<configSections>??
  • ??????</configSections>??
  • ??????<connectionStrings>??
  • ????????????<add?name="UI.My.MySettings.MyChargeSystemConnectionString"?connectionString="Data?Source=(local);Initial?Catalog=MyChargeSystem;User?ID=sa;Password=123456"??
  • ??????????????????providerName="System.Data.SqlClient"?/>??
  • ??????</connectionStrings>??
  • ??????<appSettings>???
  • ??????????<add?key="strConnection"?value="Server=bao;DataBase=MyChargeSystem;User?ID=sa;Password=123456"??/>??
  • ??????????<add?key?="DALName"?value?="SqlServerDAL"/>????
  • ??????</appSettings>??
  • ??????????
  • ??????<startup>????
  • ??????<supportedRuntime?version="v4.0"?sku=".NETFramework,Version=v4.5"?/>??
  • ??????
  • ????</startup>??
  • ??
  • </configuration></span>??

  • ? ? ? ? 大家只要關注:<add key ="DALName" value ="SqlServerDAL"/> ?這一行就可以了,把配置文件全部內容貼出來只是讓大家了解配置文件內容的全貌。

    ? ? ? ? 考慮到以后可能更換數據庫,例如,日后我需要把現在所用的sqlserver 數據庫更換為Access,我們只需要重新添加一個程序集即可。例如把該程序集命名為AccessDAL,緊接著,配置文件中把

    <add key ="DALName" value ="SqlServerDAL"/>

    更改為

    <add key ="DALName" value ="AccessDAL"/>?

    ? ? ? ? 然后在里面添加其他類,類名和里面的方法還應用SqlServer 數據庫時的類名和方法就可以了,而不需要更改程序的其他程序集(其他的層)。見下圖


    小結

    ? ? ? ? 不管黑貓白貓,逮住老鼠就是好貓。解決問題的方法往往不局限于一種,我相信抽象工廠+反射+配置文件 這個組合不僅僅能更換一個數據庫,還能解決其他的一些問題。這都需要我們對寫程序有一種鉆研和癡迷的精神,就像小菜最后說的:無癡迷,不成功。相信大家經過不懈的努力,都會成為優秀的程序員。

    總結

    以上是生活随笔為你收集整理的谈一谈:抽象工厂+反射+配置文件 实现数据访问程序的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。