ASP.NET三層結(jié)構(gòu)的說明及三層架構(gòu)的缺點
ASP.NET三層結(jié)構(gòu)說明
完善的三層結(jié)構(gòu)的要求是:修改表現(xiàn)層而不用修改邏輯層,修改邏輯層而不用修改數(shù)據(jù)層。否則你的應用是不是多層結(jié)構(gòu),或者說是層結(jié)構(gòu)的劃分和組織上是不是有問題就很難說.不同的應用有不同的理解,這只是一個概念的問題.
理解ASP.NET三層結(jié)構(gòu)——為什么要分三層?
我們用三層結(jié)構(gòu)主要是使項目結(jié)構(gòu)更清楚,分工更明確,有利于后期的維護和升級。它未必會提升性能,因為當子程序模塊未執(zhí)行結(jié)束時,主程序模塊只能處于等待狀態(tài)。這說明將應用程序劃分層次,會帶來其執(zhí)行速度上的一些損失。但從團隊開發(fā)效率角度上來講卻可以感受到大不相同的效果。
需要說明一下,三層結(jié)構(gòu)不是.NET的專利,也不是專門用在數(shù)據(jù)庫上的技術。它是一種更加普適的架構(gòu)設計理念。
此種架構(gòu)要在數(shù)據(jù)庫設計上注意表之間的關系,盡力滿足主與子的關系。在功能上對用戶要有一定的限制,不要表現(xiàn)在對于子表的刪除操作一定要慎重,以免造成主表與子表的數(shù)據(jù)在邏輯上出現(xiàn)的主表的外鍵在子表中沒有相對應的值。
對于表的綜合查詢方法是:
先對主表查詢,調(diào)用主表所對應的DL。再根據(jù)主表的記錄分別對每一個子表進行查詢。將自表的查詢結(jié)果添加的主表后,形成一個大的查詢集合。
對于表的操作(增刪改):
此時只對主表進行操作,調(diào)用主表對應的DL中的操作方法。
RL層是邏輯判斷層,主要是對頁面上傳入的數(shù)據(jù)進行邏輯判斷。RL層之上就是UI
如何建立一個三層體系結(jié)構(gòu)解決方案
新建一個空白解決方案。然后:
“添加”-“新建項目”-“其他項目”-“企業(yè)級模版項目”-“C#生成塊”-“數(shù)據(jù)訪問”(數(shù)據(jù)層,下簡稱D層)
“添加”-“新建項目”-“其他項目”-“企業(yè)級模版項目”-“C#生成塊”-“業(yè)務規(guī)則”(業(yè)務層,下簡稱C層)
“添加”-“新建項目”-“其他項目”-“企業(yè)級模版項目”-“C#生成塊”-“Web用戶界面”(界面層,下簡稱U層)
右鍵點“解決方案”-“項目依賴項”,設置U依賴于D、C,C依賴于D。
對U添加引用D、C,對C添加引用D。
到此為止,一個三層的架子建立起來了。我上面說的很具體很“傻瓜”,知道的人覺得我廢話,其實我這段時間很強烈的感覺到非常多的人其實對這個簡單的過程完全不了解。雖然不反對建2個“空項目”和1個“Asp net Web應用程序項目”也可以作為3層的框架,而且相當多的人認為其實這些“企業(yè)級模板項目”其實就是個空項目,這是一個誤區(qū)。沒錯,企業(yè)級模板項目你從解決方案資源管理器里看它是個什么也沒有的,但是你可以用記事本打開項目文件,看見不同了吧??有些東西在背后,你是看不見的,不過系統(tǒng)已經(jīng)做好了。也就是說,如果你在C層里的某個類里“using System Data SqlClineit”,或者使用一個SqlConnection對象,編譯時候不會出錯,但是會在“任務列表”里生成一些“策略警告”,警告你在C層里不要放應該放在D層的東西(雖然就程序來說沒錯,但是可讀性可維護性就打了折扣)而這種功能,空項目是無法給你的。
在新TraceLWord3中,應用了“企業(yè)級模板項目”。把原來的LWordTask.cs,并放置到一個單一的項目里,項目名稱為:AccessTask。解決方案中又新建了一個名稱為:InterService的項目,該項目中包含一個LWordService.cs程序文件,它便是“中間業(yè)務層”程序。為了不重復命名,TraceLWord3的網(wǎng)站被放置到了WebUI項目中。更完整的代碼,可以在CodePackage/TraceLWord3目錄中找到——
ASP.NET三層結(jié)構(gòu):面象對象與實際的結(jié)合
我們知道建橋需要磚塊,應該是先準備好磚再來建橋,不過為了講解上的順序性和連貫性,簡單性。我們先建橋,建的過程中需要磚塊再現(xiàn)做,這樣就不會多出來“橋不需要的東西”。注意在實際中,還是應該先準備磚塊。
U層其實就是橋,C層是磚塊,D層是原料(石頭、沙子)。這也解釋前面為什么U層要引用、依賴D層(而不是U對C,C對D的層次),因為橋除了需要磚頭,其實也需要石頭沙子。
“三層結(jié)構(gòu)”的缺點
有些網(wǎng)友在讀完這篇文章前作之后,對我提出了一些質(zhì)疑,這提醒我文章至此還沒有提及“三層結(jié)構(gòu)”的缺點?!叭龑咏Y(jié)構(gòu)”這個詞眼似乎一直都很熱門,究其原因,或許是這種開發(fā)模式應用的比較普遍。但是“三層結(jié)構(gòu)”卻并不是百試百靈的“萬靈藥”,它也存在著缺點。下面就來說說它的缺點……
“三層結(jié)構(gòu)”開發(fā)模式的一個非常明顯的缺點就是其執(zhí)行速度不夠快。當然這個“執(zhí)行速度”是相對于非分層的應用程序來說的。從文中所給出的時序圖來看,也明顯的暴露了這一缺點。TraceLWord1和TraceLWord2沒有分層,直接調(diào)用的ADO.NET所提供的類來獲取數(shù)據(jù)。但是,TraceLWord6確要經(jīng)過多次調(diào)用才能獲取到數(shù)據(jù)。在子程序模塊程序沒有返回時,主程序模塊只能處于等待狀態(tài)。所以在執(zhí)行速度上,留言板的版本越高,排名卻越靠后?!叭龑咏Y(jié)構(gòu)”開發(fā)模式,不適用于對執(zhí)行速度要求過于苛刻的系統(tǒng),例如:在線訂票,在線炒股等等……它比較擅長于商業(yè)規(guī)則容易變化的系統(tǒng)。
“三層結(jié)構(gòu)”開發(fā)模式,入門難度夠高,難于理解和學習。這是對于初學程序設計的人來說的。以這種模式開發(fā)出來的軟件,代碼量通常要稍稍多一些。這往往會令初學者淹沒在茫茫的代碼之中。望之生畏,對其產(chǎn)生反感,也是可以理解的……
其實,無論哪一種開發(fā)模式或方法,都是有利有弊的。不會存在一種“萬用法”可以解決任何問題。所以“三層結(jié)構(gòu)”這個詞眼也不會是個例外!是否采用這個模式進行系統(tǒng)開發(fā),要作出比較、權衡之后才可以。切忌濫用!
【編輯推薦】