淺談ASP.NET中多層架構(gòu)
很多人對(duì)開(kāi)發(fā)多層應(yīng)用程序感到一定的困難。來(lái)看一個(gè)例子:對(duì)于一個(gè)只有一兩個(gè)人的小公司,一個(gè)人可能同時(shí)擔(dān)當(dāng)老板、出納、會(huì)計(jì)、市場(chǎng)、銷(xiāo)售、開(kāi)發(fā)等多項(xiàng)工作。而對(duì)于一個(gè)大公司,就會(huì)進(jìn)行比較嚴(yán)密的分工,每個(gè)人只完成一部分工作,需要彼此配合才能保證正常運(yùn)轉(zhuǎn)。以前的開(kāi)發(fā)程序就類(lèi)似于一個(gè)小公司,從用戶界面到數(shù)據(jù)庫(kù)訪問(wèn)等所有功能都在一個(gè)頁(yè)面內(nèi)完成,這樣的缺點(diǎn)有:
1. 開(kāi)發(fā)起來(lái)比較困難,很難實(shí)現(xiàn)多人協(xié)作開(kāi)發(fā)
2. 一旦數(shù)據(jù)庫(kù)或規(guī)則有變,就可能要重新修改整個(gè)頁(yè)面,加大維護(hù)成本
3. 因?yàn)樗泄δ芏蓟旌显谝黄?,程序重用性差。如果開(kāi)發(fā)一個(gè)新項(xiàng)目,幾乎要重寫(xiě)代碼
為了解決這個(gè)問(wèn)題,人們就提出了“多層應(yīng)用程序”概念,其本質(zhì)類(lèi)似于一個(gè)職權(quán)明確的大公司,對(duì)頁(yè)面進(jìn)行分工,將數(shù)據(jù)訪問(wèn)、業(yè)務(wù)規(guī)則等功能都放在專(zhuān)門(mén)的文件中。比較流行的有二層架構(gòu)、三層架構(gòu)和MVC。
一. 二層架構(gòu)
二層架構(gòu),就是將程序分為用戶界面層和數(shù)據(jù)訪問(wèn)層。其本質(zhì)是將訪問(wèn)數(shù)據(jù)庫(kù)的代碼放入數(shù)據(jù)訪問(wèn)層中,而用戶界面層通過(guò)數(shù)據(jù)訪問(wèn)層對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作。 相互作用關(guān)系如下:("<--->"表示雙向箭頭)
用戶界面 <---> 數(shù)據(jù)訪問(wèn) <---> 數(shù)據(jù)庫(kù)
二. 三層架構(gòu)
三層架構(gòu),即將二層架構(gòu)中的業(yè)務(wù)邏輯從數(shù)據(jù)訪問(wèn)層中分離出來(lái),成為一個(gè)單獨(dú)的業(yè)務(wù)邏輯層。將程序分為三層后,數(shù)據(jù)訪問(wèn)層就只管對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,而業(yè)務(wù)邏輯層負(fù)負(fù)責(zé)對(duì)數(shù)據(jù)進(jìn)行各種處理。
從頂層上主要包含了4個(gè)部件:DAL(數(shù)據(jù)處理層)、BLL(業(yè)務(wù)邏輯層)、UI(用戶接口層)、Model(實(shí)體模型)。其中前三者就是人們常說(shuō)的三層結(jié)構(gòu)。
1)數(shù)據(jù)訪問(wèn)層(database access layer,DAL):有時(shí)候也稱(chēng)為是持久層,其功能主要是負(fù)責(zé)數(shù)據(jù)庫(kù)的訪問(wèn)。簡(jiǎn)單的說(shuō)法就是實(shí)現(xiàn)對(duì)數(shù)據(jù)表的Select,Insert,Update, Delete的操作。如果要加入ORM的元素,那么就會(huì)包括對(duì)象和數(shù)據(jù)表之間的mapping,以及對(duì)象實(shí)體的持久化;
2)業(yè)務(wù)邏輯層(business logic layer, BLL):是整個(gè)系統(tǒng)的核心,它與這個(gè)系統(tǒng)的業(yè)務(wù)(領(lǐng)域)有關(guān);
3)表示層(user interface layer, UIA):是系統(tǒng)的UI部分,負(fù)責(zé)使用者與整個(gè)系統(tǒng)的交互。在這一層中,理想的狀態(tài)是不應(yīng)包括系統(tǒng)的業(yè)務(wù)邏輯。表示層中的邏輯代碼,僅與界面元素有關(guān);
4)實(shí)體模型層(Model):包含了所有的數(shù)據(jù)信息,這些數(shù)據(jù)信息以各種Entity實(shí)例的形式存在。是整個(gè)系統(tǒng)基礎(chǔ)層次;

完善的三層結(jié)構(gòu)應(yīng)該是:修改表示層而不用修改邏輯層,修改邏輯層二不用修改數(shù)據(jù)訪問(wèn)層。達(dá)到一定程度上的解耦。
三層架構(gòu)主要是使項(xiàng)目結(jié)構(gòu)更清楚,分工更明確,有利于后期的維護(hù)和升級(jí)。它解決了整個(gè)應(yīng)用程序中各個(gè)業(yè)務(wù)操作過(guò)程中不同階段的代碼封裝的問(wèn)題,使程序員更加專(zhuān)注的處理某階段的業(yè)務(wù)邏輯。然而未必會(huì)提升性能,因?yàn)楫?dāng)子程序模塊未執(zhí)行結(jié)束時(shí),主程序模塊只能處于等待狀態(tài)。這說(shuō)明將應(yīng)用程序劃分層次,會(huì)帶來(lái)其執(zhí)行速度上的一些損失。但從團(tuán)隊(duì)開(kāi)發(fā)效率角度上來(lái)講卻可以感受到大不相同的效果。
需要注意的是,雖然三層架構(gòu)有很多的好處,但如果你的程序很簡(jiǎn)單,或者將來(lái)肯定不會(huì)重用,或不一定要采用兩層架構(gòu),也許采用兩層或普通的程序開(kāi)發(fā)速度會(huì)更快。要根據(jù)實(shí)際情況具體處理。
三. MVC
M 即Model(模型層),主要負(fù)責(zé)出來(lái)業(yè)務(wù)邏輯以及數(shù)據(jù)庫(kù)的交互;
V 即View(視圖層),主要用于顯示數(shù)據(jù)和提交數(shù)據(jù);
C 即Controller(控制器),主要是用作捕獲請(qǐng)求并控制請(qǐng)求轉(zhuǎn)發(fā);
MVC是在應(yīng)用程序(BS結(jié)構(gòu))的視圖層劃分出來(lái)的不同功能的幾個(gè)模塊,主要是為了解決應(yīng)用程序用戶界面的樣式替換問(wèn)題,把展示數(shù)據(jù)的 HTML 頁(yè)面盡可能的和業(yè)務(wù)代碼分離。
四. 三層結(jié)構(gòu)與MVC的區(qū)別
區(qū)別的話,看圖就能明白:

圖2. MVC 與 三層架構(gòu)的區(qū)別
三層架構(gòu)是界面層(UI)業(yè)務(wù)邏輯層(BLL)和數(shù)據(jù)訪問(wèn)層(DAL)構(gòu)成的,而MVC是模型層(M)界面層(View)和控制層(Controller)構(gòu)成的,而且他們之間也不對(duì)應(yīng)。
如果硬要給他們對(duì)應(yīng)的話,那么三層架構(gòu)中的UI對(duì)應(yīng)MVC中的view都是用于顯示以及獲取界面的數(shù)據(jù);三層架構(gòu)中的BLL層和DAL層對(duì)應(yīng)MVC中的Model層都是用于處理上層傳遞來(lái)的數(shù)據(jù)以及從數(shù)據(jù)庫(kù)獲取的數(shù)據(jù)的;MVC中的Controller最多算是三層架構(gòu)中的UI的一部分。
五. 三層架構(gòu)引用關(guān)系
Model層:不引用任何項(xiàng)目;
DAL層:引用Model,通過(guò)讀取web.config里的程序集,加載類(lèi)的實(shí)例,返回給BLL使用;
BLL層:引用Model,DAL;
UI層:引用Model, BLL;
方法是在資源管理器中右擊項(xiàng)目文件,添加引用。在彈出的對(duì)話框中選中項(xiàng)目標(biāo)簽,選擇適當(dāng)?shù)念?lèi)庫(kù)后點(diǎn)擊確定。然后再在項(xiàng)目文件中添加using “引用類(lèi)的命名空間”。
項(xiàng)目已經(jīng)添加了引用,但仍然找不到指定類(lèi)庫(kù)文件,可檢查:
1. 引用的項(xiàng)目中是否有語(yǔ)法錯(cuò)誤,是否在頭文件中添加using “命名空間”;
2. 添加的類(lèi)庫(kù)時(shí),是否該類(lèi)庫(kù)為public。
以上所述就是本文的全部?jī)?nèi)容了,希望大家能夠喜歡。
相關(guān)文章
Asp.Net?Core配置多環(huán)境log4net配置文件的全過(guò)程
在.NET世界中有非常多的日志框架,然而log4net是目前為止最流行的一款日志框架,下面這篇文章主要給大家介紹了關(guān)于Asp.Net?Core配置多環(huán)境log4net配置文件的相關(guān)資料,需要的朋友可以參考下2022-04-04
asp.net fileupload 實(shí)現(xiàn)上傳
在vs的視圖模式下,添加上傳組件,以及添加一個(gè)按鈕button,隨后在后置代碼中加入如下信息2009-05-05
.NET 下運(yùn)用策略模式(組合行為和實(shí)體的一種模式)
我簡(jiǎn)單的理解策略模式就是把行為(方法)單獨(dú)的抽象出來(lái),并采用組合(Has-a)的方式,來(lái)組合行為和實(shí)體的一種模式比如,.NET中對(duì)數(shù)組排序的Sort的方法就是一個(gè)策略模式的實(shí)現(xiàn)模板2012-12-12
Asp.Net Core實(shí)現(xiàn)Excel導(dǎo)出功能的實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于Asp.Net Core實(shí)現(xiàn)Excel導(dǎo)出功能的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
ASP.NET MVC使用EasyUI的datagrid多選提交保存教程
ASP.NET MVC使用EasyUI的datagrid多選提交保存教程,需要的朋友可以參考下。2011-12-12
gridview實(shí)現(xiàn)服務(wù)器端和客戶端全選的兩種方法分享
這篇文章主要介紹了gridview實(shí)現(xiàn)服務(wù)器端和客戶端全選的兩種方法,需要的朋友可以參考下2014-02-02
ASP.NET在IE10中無(wú)法判斷用戶已登入及Session丟失問(wèn)題解決方法
IE10中Session丟失問(wèn)題引起眾多業(yè)內(nèi)人士的關(guān)注,今天發(fā)現(xiàn)在IE10中登錄網(wǎng)站時(shí),使用表單驗(yàn)證機(jī)制(FormsAuthentication)卻無(wú)法判斷該用戶已登入,保存的Session總會(huì)丟失,本文將介紹解決方法,感興趣的朋友可以參考下,或許對(duì)你有所幫助2013-02-02
js獲取Treeview選中的節(jié)點(diǎn)(C#選中CheckBox項(xiàng))
方法網(wǎng)上有很多,試了一下都有瑕疵,于是設(shè)置斷點(diǎn)調(diào)試,各個(gè)屬性查找有用的字段,終于找到,接下來(lái)與大家分享解決方法,需要了解的朋友可以參考下2012-12-12

