摘要:分析了傳統(tǒng).NET開發(fā)中三層架構(gòu)的原理,結(jié)合基于關(guān)系數(shù)據(jù)的.NET語言集成查詢LINQ(Language INtegrated Query)的架構(gòu)和原理,給出了如何應(yīng)用LINQ在WEB開發(fā)中實現(xiàn)三層架構(gòu)。
關(guān)鍵詞:三層架構(gòu);語言級集成查詢;LINQ To SQL;.NET3.5
中圖分類號:TP311文獻(xiàn)標(biāo)識碼:A文章編號:1009-3044(2010)11-2580-02
The Realization of Three-tier Architecture Based on LINQ in .NET Development
ZHAN Fei
(Department of Computer Engineering, Xi’An Aerotechniccal College, Xi'an 710077, China)
Abstract: The paper analyzes the principle of traditional three-tier architecture, connects the LINQ(Language INtegrated Query) and gives the realization of new three-tier architecture in WEB development based on LINQ.
Key words: three-tier architecture; LINQ; LINQ To SQL; .NET3.5
1 概述
傳統(tǒng)的三層架構(gòu)(3-tier application)被廣泛的應(yīng)用與.NET平臺下的WEB開發(fā)和WINFORM開發(fā),通常意義上的三層架構(gòu)就是將整個業(yè)務(wù)應(yīng)用劃分為:表現(xiàn)層(UI)、業(yè)務(wù)邏輯層(BLL)、數(shù)據(jù)訪問層(DAL)。使用三層架構(gòu)的優(yōu)點是加強了數(shù)據(jù)的安全性,易于實現(xiàn)高內(nèi)聚低耦合的思想,同時利于代碼的復(fù)用。
LINQ稱為語言級集成查詢(Language INtegrated Query),是微軟最新發(fā)布的Visual Studio 2008 和.NET 3.5中的性特性。它是集成在.NET編程語言中的一種特性。LINQ定義了一組標(biāo)準(zhǔn)查詢操作符用于在所有基于.NET平臺的編程語言中更加直接地聲明跨越、過濾和投射操作的統(tǒng)一方式,標(biāo)準(zhǔn)查詢操作符允許查詢作用于所有基于IEnumerable
2 應(yīng)用LINQ 開發(fā)模式和傳統(tǒng)的三層架構(gòu)的區(qū)別
在傳統(tǒng)的三層架構(gòu)開發(fā)模式中,程序?qū)I(yè)務(wù)規(guī)則、數(shù)據(jù)訪問、合法性校驗等工作放到了中間層進(jìn)行處理。通常情況下,表示層不直接與底層數(shù)據(jù)進(jìn)行交互,而是通過與中間層建立連接,再經(jīng)由中間層與數(shù)據(jù)庫進(jìn)行交互。但是,LINQ的誕生改變了我們傳統(tǒng)訪問數(shù)據(jù)的方式,利用基于關(guān)系數(shù)據(jù)的.NET語言集成查詢(LINQ to SQL),可以實現(xiàn)以對象形式管理關(guān)系數(shù)據(jù),并提供了豐富的查詢功能。其建立于公共語言類型系統(tǒng)中的基于SQL的模式定義的集成之上,當(dāng)保持關(guān)系型模型表達(dá)能力和對底層存儲的直接查詢評測的性能時,這個集成在關(guān)系型數(shù)據(jù)之上提供強類型。換句話說,利用LINQ我們可以方便的在表示層利用一些LINQ語句直接實現(xiàn)對數(shù)據(jù)的訪問,通過創(chuàng)建LINQ to SQL的類。
我們現(xiàn)以自帶的示例數(shù)據(jù)庫Northwind為例說明如何利用LINQ在WEB開發(fā)中直接實現(xiàn)數(shù)據(jù)的訪問。
首先利用VS2008創(chuàng)建站點,然后增加LINQ to SQL classes,選擇C#語言,重命名為Northwind.dbml。打開NORTHWIND.MDF節(jié)點,將自帶表Products拖入Northwind.dbml中。
其次,新建表示層的WEB頁面,拖入數(shù)據(jù)邦定控件GridView,進(jìn)入PageLoad事件,添加如下代碼:
NorthwindDataContext db = new NorthwindDataContext();
var product = from p in db.Products select p;
GridView1.DataSource=product;
GridView1.DataBind();
最后,運行頁面可以看到圖1,實現(xiàn)了表示層數(shù)據(jù)的訪問。
3 LINQ開發(fā)應(yīng)用中實現(xiàn)三層架構(gòu)
通過上一小節(jié),利用LINQ沒有把操作方法傳統(tǒng)地放在底層不太符合三層架構(gòu)的思想。但實際上,我們也并沒有去操作數(shù)據(jù)實體,而是操作對象,接著LINQ會幫我們把這些操作應(yīng)用在數(shù)據(jù)上。即使是這樣,在表示層中來實現(xiàn)對象的操作方法也是欠妥當(dāng)?shù)模覀円廊幌M芤匀龑蛹軜?gòu)的方式利用LINQ進(jìn)行開發(fā)和代碼的復(fù)用,結(jié)構(gòu)圖如圖2所示。
我們?nèi)匀灰詣偛艅?chuàng)建的站點和示例數(shù)據(jù)庫Northwind為例,展示如何將上述例子改造為三層架構(gòu)。
首先,在站點上新建項目,添加新的業(yè)務(wù)邏輯層BLL,在BLL層中添加針對Products的業(yè)務(wù)邏輯類Productbll.cs。
其次,修改Productbll.cs中的代碼至如下:
NorthwindDataContext db = new NorthwindDataContext();
public Productbll()
{
}
//返回Products表中的所有字段
[System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select, true)]
public IQueryable GetProduct()
{
var product = from p in db.Products select p;
return product;
}
其中創(chuàng)建一個DataContext實例,以便在后面的方法中直接使用,接下來是一段聲明,告訴自動識別系統(tǒng)該方法是查詢方法。IQueryable是返回值的類型,可以直接作為Datasource使用。
最后,添加數(shù)據(jù)邦定控件GridView和數(shù)據(jù)源控件,就可以像傳統(tǒng)的三層架構(gòu)模式去針對數(shù)據(jù)庫的增刪改查,去選擇業(yè)務(wù)邏輯層的對應(yīng)的方法,通過業(yè)務(wù)邏輯層實現(xiàn)對數(shù)據(jù)層數(shù)據(jù)的操作。如圖3所示。
4 結(jié)束語
該文以.NET 下WEB開發(fā)為例,分析了傳統(tǒng)三層架構(gòu)模式訪問數(shù)據(jù)和LINQ下訪問數(shù)據(jù)的區(qū)別,提出了如何實現(xiàn)基于LINQ下三層架構(gòu)的方法和基本的實現(xiàn)代碼。雖然LINQ及LINQ TO SQL提供的類,以操作對象方式避免了操作數(shù)據(jù)實體,但是我們還是希望能以更合理的三層架構(gòu)方式去更加方便快捷的利用LINQ進(jìn)行項目開發(fā)。
參考文獻(xiàn):
[1] 王的強,張曉娜,周靜.LINQ入門及應(yīng)用[M].北京:清華大學(xué)出版社,2009:37-40.
[2] 侯利軍.精通LINQ數(shù)據(jù)訪問技術(shù)[M].北京:人民郵電出版社,2008:87-88.
[3] 龔赤兵.VISUAL STUDIO2008中的LINQ開發(fā)技術(shù)[M].北京:機械工業(yè)出版社,2009:213-219.