生活随笔
收集整理的這篇文章主要介紹了
谈一谈:抽象工厂+反射+配置文件 实现数据访问程序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
??《大話設計模式》中第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?? ?????? ????Dim?AssemblyName?As?String?=?System.Configuration.ConfigurationManager.AppSettings("assName")?? ?????? ????Dim?db?As?String?=?System.Configuration.ConfigurationManager.AppSettings("DB")?? ?????? ????Public?Function?CreateUserInfo()?As?IDAL.IUserInfo?? ????????Dim?dalUserInfoName?As?String?=?AssemblyName?&?"."?&?db?&?"UserInfoDAL"?????????? ????????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")???? ?? ?????? ????Public?Function?CreateIUser()?As?IDAL.IUser?? ?????????? ????????Return?CType(Assembly.Load(strDALName).CreateInstance(strDALName?+?"."?+?"UserDAL"),?IDAL.IUser)?? ????End?Function?? ?????? ????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 數據庫時的類名和方法就可以了,而不需要更改程序的其他程序集(其他的層)。見下圖
小結
? ? ? ? 不管黑貓白貓,逮住老鼠就是好貓。解決問題的方法往往不局限于一種,我相信抽象工廠+反射+配置文件 這個組合不僅僅能更換一個數據庫,還能解決其他的一些問題。這都需要我們對寫程序有一種鉆研和癡迷的精神,就像小菜最后說的:無癡迷,不成功。相信大家經過不懈的努力,都會成為優秀的程序員。
總結
以上是生活随笔為你收集整理的谈一谈:抽象工厂+反射+配置文件 实现数据访问程序的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。