梁啟恒
摘要:文章對.NET三層架構的耦合性進行了探討,提出一種利用強數據類型數據集和反射、泛型技術對數據訪問層進行解耦的開發(fā)模型并實現之,進一步降低三個層次之間的耦合度。
關鍵詞:數據訪問層;解耦;反射;泛型;三層架構技術
0引言
我們開發(fā)業(yè)務系統(tǒng),都會希望這個業(yè)務系統(tǒng)具備模塊化、松耦合的特性,這樣可以達到快速開發(fā)和適應業(yè)務系統(tǒng)變更的目的。
1三層架構
通常意義上的三層架構(3-tier architecture)就是將整個系統(tǒng)從上至下劃分為:表示層(UI)、業(yè)務邏輯層(BLL)、數據訪問層(DAL)。區(qū)分層次的目的體現了“高內聚,低耦合”的思想,三個層次各負其責,相對獨立。數據訪問層僅僅負責對數據庫的增刪查改,功能可以很簡單。業(yè)務邏輯層負責從數據訪問層獲取數據,根據業(yè)務邏輯對數據進行處理,并將處理結果提供給表示層進行顯示。表示層一般是通過用戶界面,將用戶的輸入(請求)經過簡單處理,提交給表示層,然后把表示層返回的結果在用戶界面上顯示。
2三層架構的解耦
三層架構的優(yōu)勢,是各司其職,降低耦合。耦合度的衡量,可以通過考察三個層次之間的依賴關系。依賴關系越緊密,耦合度越高。耦合度高的稱之為緊耦合,反之稱為松耦合。我們的目標就是降低三層之間的依賴關系,如:在數據訪問層發(fā)生改變時,業(yè)務邏輯層不需要做出修改或盡量少修改。松耦合的三層架構有助于我們快速開發(fā)應用,也有助于我們靈活地增添業(yè)務模塊。
本文的目的,就是提出一種在NET三層架構中對數據訪問層進行解耦的快速開發(fā)模型并實現之。
3數據訪問層的解耦模型
通常在三層架構中,數據訪問層與數據庫的耦合度很高。雖然數據訪問層功能較簡單,主要是實現數據的增刪查改。但是在實際的開發(fā)實踐中,這一部分的開發(fā)往往需要開發(fā)人員編寫大量的SQL語句,如果數據表發(fā)生改變,幾乎所有有關的增刪查改的SQL語句都需要修改,增加了升級和維護的工作量,且極易出錯。
解決辦法是,我們可以通過使用.NET框架下的強數據類型數據集DataSet,建立模型類Model,利用反射和泛型,實現數據訪問層的解耦。反射可以將Model和DataSet的數據表進行自動映射轉換,使得我們在執(zhí)行增刪查改操作時不必關心字段參數,只需模型類的屬性與數據表字段一一對應即可。利用泛型則解決了多表的問題:實現一個泛型類,就可以對應所有數據表的增刪查改操作,而不需要對每張數據表都編寫一個數據訪問類。泛型簡化了代碼,也降低了DAL與數據庫的耦合度。增加一個數據表,或是修改數據表,只需要更新DataSet和Model,就可以實現對新數據表的增刪查改操作,大大降低代碼的維護量。
泛型實現的關鍵就是新增的模型類Model。模型類是數據表的實體類,要求其對外公開的屬性與數據庫表的字段具有一一對應關系。DAL、BLL、UI三層分別引用Model,Model事實上成為各層訪問數據的接口定義。利用反射機制使模型類和數據訪問類泛型化,進一步抽象,統(tǒng)一外部對各數據表的訪問,從而降低各層之間的耦合度,更是數據訪問層解耦的關鍵之處。(圖1)
4 DAL解耦模型的實現
4.1強數據類型數據集DataSet
DataSet可以在VS IDE中通過拖動數據源快速生成各數據表的實例。使用強數據類型數據集,各數據項都有明確的類型定義,如果類型不符,編譯就會出錯。這樣有兩個好處,一是減少出錯機會,二是可以快速生成,減少代碼的編寫,VS支持直接拖動數據表生成實例,不用編寫一句代碼。在DataSet中,每個數據表適配器TableAdapter都是訪問對應數據表的接口類,如userTableAdapter是訪問user數據表的接口類。在DAL中通過初始化TableAdapter來訪問數據表。我們?yōu)槊總€數據表適配器TableAdapter添加增刪查改方法,如InsertQuery、UpdateQuery等。為方便BLL的數據處理,InsertQuery應添加select@@identity,并將ExecuteMode更改為Scalar模式,以返回新增數據的Identity值,即ID值。
4.2泛型數據適配器DataAdapter
為了簡化對數據庫的訪問,在DAL添加一個訪問數據集的泛型數據適配器DataAdapter,使用泛型聲明,如:
public class DataAdapter
where T:class,Hew()
where D:class,new0
其中,T為模型類,D為數據表適配器TableAdapter。DAL對所有數據表的訪問都可以通過DataAdapter來實現。如前文所述,這個泛型數據適配器可以適應對所有數據表的訪問操作。
泛型數據適配器DataAdapter是這個模型的核心,其實現方法是:①首先聲明并初始化一個數據表適配器的泛型變量,private D adapter=new D(),adapter變量就代表了所有的數據表適配器TableAdapter。②創(chuàng)建一個方法getProperties,把模型實體類T轉換為訪問數據表的參數對象列表。③創(chuàng)建一個輔助類ModelConvertHelper