< DOCTYPE html PUBLIC -WCDTD XHTML TransitionalEN httpwwwworgTRxhtmlDTDxhtml-transitionaldtd>
1.ms介紹
為了簡化資料庫通路類的使用,我們選擇 GoF (譯注:指 Erich Gamma 等著《設計模式》一書)概述的工廠設計模式,通過反射動态在運作時加載正确的資料通路對象。 工廠設計模式是這樣實作的: 建立一個 C# 接口,其中對于資料庫通路類必須公開的每個方法都要聲明一個方法。 對于每一個要支援的資料庫,都建立一個實作資料庫特定代碼的具體類,以執行接口也稱“協定”中的每一項操作。 為了支援運作時确定加載哪一個具體類,需要建立第三個類,也就是工廠類,它從配置檔案中讀入一個值以确定應該使用反射加載哪一個程式集。 通過 .NET 的反射命名空間,可以加載某個特定程式集并用該程式集建立某個對象的執行個體。 為了使應用程式更安全,為版本控制提供更好的支援,我們可以在應用程式配置檔案(也就是這裡的 web.config. )中添加要加載的程式集檔案的“證據”,這意味着 .NET 架構将隻加載我們在編譯期間簽過名而且有正确版本号的程式集。 圖 10 說明了業務邏輯類、工廠類和資料庫通路類是如何互相操作的。 這一建立的解決方案最重要的優勢是資料庫通路類可以在業務邏輯類之後編譯,隻要資料通路類實作了 IDAL 接口。 這意味着,如果要建立應用程式的 DB2 版本,我們不需要改動業務邏輯層(或者 UI 層)。 建立 DB2 相容版本的步驟如下:
1.建立 DB2 的資料庫通路類,它應該實作 IDAL 接口。
2.将 DB2 通路類編譯成一個程式集。
3.測試和部署新的資料程式集到一台運作中的伺服器上。
4.更改配置檔案,指向新的資料庫通路類。
無需更改或重新編譯業務邏輯元件。
圖 10. .NET Pet Shop 中 DAL 工廠類的實作
2.資料分析
5 PetShop.DALFactory 資料通路工廠
工廠模式是設計模式的一種,以我了解就像Factory這個詞一樣,對于使用者來說,工廠裡産品如何生産的你不用知道,你隻要去用工廠裡生産出來的東西就可以了。MSPetShop3.0用工廠模式來實作了對SqlServer和Oracle資料庫通路的操作,而使用者(business Logic Layer)不用知道也不用關心背景用的是哪一種資料庫,它隻要用接口就行了,接口中定義了要用的方法,當調用接口時會根據具體的情況再去調用底層資料通路操作。而現在這個DALFactory就是關鍵,當BLL層要操作資料庫時,DALFactory會根據具體情況再去使用本文上面介紹的SqlServerDAL和OracleDAL中的一個。這樣系統上層隻管調用,而下層來實作細節,上級隻管發号施令,下級去幹活。對于上層來說實作細節被隐藏了。
那麼DALFactory是如何決定應該用SqlServerDAL還是用OracleDAL的呢?我們接着分析。
以下是PetShop.DALFactory.Account類的實作:
namespace PetShop.DALFactory {
/// <summary>
/// Factory implementaion for the Account DAL object
/// </summary>
public class Account
{
public static PetShop.IDAL.IAccount Create()?//<<<<?----這裡傳回接口
{?
/// Look up the DAL implementation we should be using
string path = System.Configuration.ConfigurationSettings.AppSettings["WebDAL"];
string className = path + ".Account";
// Using the evidence given in the config file load the appropriate assembly and class
return (PetShop.IDAL.IAccount) Assembly.Load(path).CreateInstance(className);
}
以下則是web.config中<appSettings>節點中的一部分:
<add key="WebDAL" value="PetShop.SQLServerDAL">
<add key="OrdersDAL" value="PetShop.SQLServerDAL">?
<add key="Event Log Source" value=".NET Pet Shop">
上面的Create()方法傳回IAccount接口,用System.Configuration.ConfigurationSettings.AppSettings["WebDAL"];則可以得到Web.config的<appsettings>節點中的關于系統中應該使用哪個資料通路層(SqlserverDAL還是OracleDAL)的資訊。因為我在安裝PetShop3.0時選擇的是Sqlserver是以在此是:value="PetShop.SQLServerDAL",如果用的是Oracle那就是value="PetShop.OracleDAL" 了吧!而且這個檔案也應該是可以更改的。接下來className=path+”.Account”傳回的應該是PetShop.SQLServerDAL.Account,然後再用Assembly.Load加載PetShop.SQLServerDAL.dll,同時建立PetShop.SQLServerDAL.Account的執行個體,并以接口(PetShop.IDAL.IAccount)類型傳回。這樣BLL調用IAccount接口時就會用PetShop.SQLServerDAL.Account類的實作代碼。(回上面第4再看一下)
看!這樣根據系統目前Web.config檔案的配置描述(這也應該是系統運作時實際的配置),BLL層隻要像下面這樣:
// Get an instance of the account DAL using the DALFactory
IAccount dal = PetShop.DALFactory.Account.Create();
AccountInfo account = dal.SignIn(userId, password);//<<?----看看上面第4點的IAccount接口
就可以直接調用接口方法通過下層DAL層操作資料庫了(在此具體為使用者賬号相關操作),而BLL層并不用知道應該通過SqlserverDAL還是OracleDAL通路資料庫,這由都DAL Factory決定,你用的是什麼資料庫以及底層細節,更不用BLL知道,這樣做的好處是對于BLL層以及更上層的程式不會或很少機率會因為底層程式變動影響,因為BLL層中調用接口就行了,隻要那個接口定義沒變,一切仍然OK.
3.相關sdk文檔資料。
Assembly 類
定義一個 Assembly,它是可重用、無版本沖突并且可自我描述的公共語言運作庫應用程式構造塊。
[Visual?Basic]<Serializable><ClassInterface(ClassInterfaceType.AutoDual)>Public Class Assembly Implements IEvidenceFactory, ICustomAttributeProvider, _ ISerializable
public static Assembly Load(string assemblyString);
描述
通過給定程式集的長格式名稱加載程式集。
參數
assemblyString
程式集名稱的長格式。
傳回值
加載的程式集。
public object CreateInstance(string typeName);
使用區分大小寫的搜尋,從此程式集中查找指定的類型,然後使用系統激活器建立它的執行個體。
typeName
要查找的類型的 Type.FullName。
表示該類型的 Object 的執行個體,其區域性、參數、聯程式設計式和激活屬性設定為空引用(Visual Basic 中為 Nothing),并且 BindingFlags 設定為 Public 或 Instance,或者設定為空引用 (Nothing)(如果沒有找到 typeName)。
本文轉自 netcorner 部落格園部落格,原文連結:http://www.cnblogs.com/netcorner/archive/2007/06/21/2912358.html ,如需轉載請自行聯系原作者