在.net中用資料工廠實現多資料庫的操作方案

iDotNetSpace發表於2008-09-16
 在專案的開發過程中,在設計模式的概念還沒有出來時,我們那時候在編寫程式時,往往如果專案的資料庫是採用SQL Server,然後使用者又想換其它資料庫如Oracle時,我們就需要對其程式碼進行重寫,特別是在一些軟體的產品化道路中,我們做出來的產品如果讓使用者可 以有選擇的去選取各種資料庫,那無疑對使用者提供了很大的方便。

自從工廠模式的設計理念出來以後,這一切實現就變得容易得多,如果大家對微軟的PETSHOP有研究的話,那就不會陌生了,從PETSHOP3.0 開始,微軟就開始採用了多資料庫作業系統的應用。資料工廠主要是通過把資料庫的連線做成一個抽象的工廠,如命名DALFactory,程式中所有的資料庫 連線都通過這個工廠類來產生,用來負責根據配置檔案動態建立系統所需的資料訪問邏輯物件。

我們就拿PETSHOP來舉例說明,PETSHOP在安裝的時候,會提示我們選擇什麼資料庫,如根據顯示的是SQL Server資料庫還是Oracle資料庫,可以得到Web.config的節點中的:


或者是


然後在DALFactory專案的DataAccess類中呼叫資料庫的連線,程式碼如下:

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,同時建立 PetShop.SQLServerDAL.Category的例項,並以介面(PetShop.IDAL.ICategory)型別返回。這樣業務邏輯 層BLL呼叫ICategory介面時就會用PetShop.SQLServerDAL.Category類的實現程式碼。

這時候使用者就不需要知道後臺使用的到底是哪一種資料庫,它只要呼叫介面就行了,在介面中定義了要使用的方法,當呼叫介面時會根據具體的情況再去呼叫 底層資料訪問操作。而現在這個DALFactory就是關鍵,當業務邏輯層要運算元據庫時,DALFactory會根據具體情況再去使用生成的程式集 SQLServerDAL或者OracleDAL中的一個,這樣做的好處是對於業務邏輯層及WEB頁面層的程式不會因為底層資料訪問的程式變動而受到影 響,因為只需要在業務邏輯層中呼叫介面就行了。

有可能有人會提,我同樣在工廠類裡面提供下面的方法去實現呼叫資料庫:


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;
}

 

而這個時候如果我們增加了新的資料庫訪問方式,就必須得修改此部分的程式,然後再重新進行編譯部署,而同樣利用反射的機制去實現的時候,我們舉個例 子如果系統中現在需要增加MySQL資料庫的時候,我們來看看它的程式碼的可擴充套件性,我們可以比較PETSHOP中的SQLServerDAL下面的 Category.cs檔案和OracleDAL下面的Category.cs檔案的程式碼可知道,因為它們都繼承了ICategory介面,所以類實現的 方法都相同,這時候我們只需要增加一個MySQLDAL專案,其下面的Category.cs檔案也同樣遵循ICategory介面的方法,這時候我們再 去修改為


這個時候都不需要重新對專案進行編譯,只需要增加MySQLDAL.DLL檔案就可,無論增加多少資料庫,都是一件很簡單的操作。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-448590/,如需轉載,請註明出處,否則將追究法律責任。

相關文章