轉(zhuǎn)帖|其它|編輯:郝浩|2010-09-28 11:40:43.000|閱讀 567 次
概述:在項(xiàng)目的開(kāi)發(fā)過(guò)程中,在設(shè)計(jì)模式的概念還沒(méi)有出來(lái)時(shí),我們那時(shí)候在編寫程序時(shí),往往如果項(xiàng)目的數(shù)據(jù)庫(kù)是采用SQL Server,然后用戶又想換其它數(shù)據(jù)庫(kù)如Oracle時(shí),我們就需要對(duì)其代碼進(jìn)行重寫,特別是在一些軟件的產(chǎn)品化道路中,我們做出來(lái)的產(chǎn)品如果讓用戶可以有選擇的去選取各種數(shù)據(jù)庫(kù),那無(wú)疑對(duì)用戶提供了很大的方便。自從工廠模式的設(shè)計(jì)理念出來(lái)以后,這一切實(shí)現(xiàn)就變得容易得多,本文將介紹在.net中如何利用數(shù)據(jù)工廠實(shí)現(xiàn)多數(shù)據(jù)庫(kù)的操作,希望對(duì)大家用幫助。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
在項(xiàng)目的開(kāi)發(fā)過(guò)程中,在設(shè)計(jì)模式的概念還沒(méi)有出來(lái)時(shí),我們那時(shí)候在編寫程序時(shí),往往如果項(xiàng)目的數(shù)據(jù)庫(kù)是采用SQL Server,然后用戶又想換其它數(shù)據(jù)庫(kù)如Oracle時(shí),我們就需要對(duì)其代碼進(jìn)行重寫,特別是在一些軟件的產(chǎn)品化道路中,我們做出來(lái)的產(chǎn)品如果讓用戶可以有選擇的去選取各種數(shù)據(jù)庫(kù),那無(wú)疑對(duì)用戶提供了很大的方便。
自從工廠模式的設(shè)計(jì)理念出來(lái)以后,這一切實(shí)現(xiàn)就變得容易得多,如果大家對(duì)微軟的PETSHOP有研究的話,那就不會(huì)陌生了,從PETSHOP3.0開(kāi)始,微軟就開(kāi)始采用了多數(shù)據(jù)庫(kù)操作系統(tǒng)的應(yīng)用。數(shù)據(jù)工廠主要是通過(guò)把數(shù)據(jù)庫(kù)的連接做成一個(gè)抽象的工廠,如命名DALFactory,程序中所有的數(shù)據(jù)庫(kù)連接都通過(guò)這個(gè)工廠類來(lái)產(chǎn)生,用來(lái)負(fù)責(zé)根據(jù)配置文件動(dòng)態(tài)創(chuàng)建系統(tǒng)所需的數(shù)據(jù)訪問(wèn)邏輯對(duì)象。
我們就拿PETSHOP來(lái)舉例說(shuō)明,PETSHOP在安裝的時(shí)候,會(huì)提示我們選擇什么數(shù)據(jù)庫(kù),如根據(jù)顯示的是SQL Server數(shù)據(jù)庫(kù)還是Oracle數(shù)據(jù)庫(kù),可以得到Web.config的節(jié)點(diǎn)中的
<add key=" WebDAL " value=" PetShop.SQLServerDAL "/>
<add key=" OrdersDAL " value=" PetShop.SQLServerDAL "/>
或者是
<add key=" WebDAL " value=" PetShop.OracleDAL "/>
<add key=" OrdersDAL " value=" PetShop. OracleDAL "/>
然后在DALFactory項(xiàng)目的DataAccess類中調(diào)用數(shù)據(jù)庫(kù)的連接,代碼如下:
private static readonly string path = ConfigurationManager.AppSettings["WebDAL"];
然后再看下面的代碼:
public static PetShop.IDAL.ICategory CreateCategory() {
string className = path + ".Category";
return (PetShop.IDAL.ICategory)Assembly.Load(path).CreateInstance(className);
}
如我們使用的是SQL Server,那么string className = path + ".Category"返回的就是PetShop.SQLServerDAL. Category,然后再用Assembly.Load加載PetShop.SQLServerDAL.DLL,同時(shí)創(chuàng)建PetShop.SQLServerDAL.Category的實(shí)例,并以接口(PetShop.IDAL.ICategory)類型返回。這樣業(yè)務(wù)邏輯層BLL調(diào)用ICategory接口時(shí)就會(huì)用PetShop.SQLServerDAL.Category類的實(shí)現(xiàn)代碼。
這時(shí)候用戶就不需要知道后臺(tái)使用的到底是哪一種數(shù)據(jù)庫(kù),它只要調(diào)用接口就行了,在接口中定義了要使用的方法,當(dāng)調(diào)用接口時(shí)會(huì)根據(jù)具體的情況再去調(diào)用底層數(shù)據(jù)訪問(wèn)操作。而現(xiàn)在這個(gè)DALFactory就是關(guān)鍵,當(dāng)業(yè)務(wù)邏輯層要操作數(shù)據(jù)庫(kù)時(shí),DALFactory會(huì)根據(jù)具體情況再去使用生成的程序集SQLServerDAL或者OracleDAL中的一個(gè),這樣做的好處是對(duì)于業(yè)務(wù)邏輯層及WEB頁(yè)面層的程序不會(huì)因?yàn)榈讓訑?shù)據(jù)訪問(wèn)的程序變動(dòng)而受到影響,因?yàn)橹恍枰跇I(yè)務(wù)邏輯層中調(diào)用接口就行了。
有可能有人會(huì)提,我同樣在工廠類里面提供下面的方法去實(shí)現(xiàn)調(diào)用數(shù)據(jù)庫(kù):
public static readonly DALFactory dalFa;
string webDal = ConfigurationManager.AppSettings["WebDAL"];
switch (webDal)
{
case "SQLServerDAL":
dalFa = new SqlServerDALFactory();
break;
case "OracleDAL":
dalFa = new OracleDALFactory();
break;
default:
dalFa = new SqlServerDALFactory();
break;
}
而這個(gè)時(shí)候如果我們?cè)黾恿诵碌臄?shù)據(jù)庫(kù)訪問(wèn)方式,就必須得修改此部分的程序,然后再重新進(jìn)行編譯部署,而同樣利用反射的機(jī)制去實(shí)現(xiàn)的時(shí)候,我們舉個(gè)例子如果系統(tǒng)中現(xiàn)在需要增加MySQL數(shù)據(jù)庫(kù)的時(shí)候,我們來(lái)看看它的代碼的可擴(kuò)展性,我們可以比較PETSHOP中的SQLServerDAL下面的Category.cs文件和OracleDAL下面的Category.cs文件的代碼可知道,因?yàn)樗鼈兌祭^承了ICategory接口,所以類實(shí)現(xiàn)的方法都相同,這時(shí)候我們只需要增加一個(gè)MySqlDAL項(xiàng)目,其下面的Category.cs文件也同樣遵循ICategory接口的方法,這時(shí)候我們?cè)偃バ薷臑?/p>
這個(gè)時(shí)候都不需要重新對(duì)項(xiàng)目進(jìn)行編譯,只需要增加MySqlDAL.DLL文件就可,無(wú)論增加多少數(shù)據(jù)庫(kù),都是一件很簡(jiǎn)單的操作,數(shù)據(jù)工廠操作多數(shù)據(jù)的優(yōu)點(diǎn)就明顯可見(jiàn)。
<add key=" WebDAL " value=" PetShop.SQLServerDAL "/>為<add key=" WebDAL " value=" PetShop.MySqlDAL "/>
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@ke049m.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載