三層架構(gòu)并不是MVC,MVC是一個(gè)很早就有的經(jīng)典的程序設(shè)計(jì)模式,M-V-C分為三 層,M(Model)-V(View)-C(Control)。而web開(kāi)發(fā)中的三層架構(gòu)是指:數(shù)據(jù)訪問(wèn)層(DAL- DatabaseAccessLayer),業(yè)務(wù)邏輯層(BLL-BusinessLoginLayer),以及用戶界面層(UI- UserInterface,實(shí)際就是網(wǎng)頁(yè)后臺(tái)的具體調(diào)用BLL層)。這個(gè)是基本概念。曾經(jīng)我以為三層架構(gòu)就是在AppCode中,分為三個(gè)大類(lèi)與若干小 類(lèi),各司其職。在經(jīng)過(guò)一番洗禮后,才發(fā)覺(jué)多么的無(wú)知。 首先AppCode中,放的是通用類(lèi),如數(shù)據(jù)庫(kù)通用類(lèi),實(shí)現(xiàn)數(shù)據(jù)庫(kù)連接,基本的SqlCommand創(chuàng)建,自定義CRUD的方法等,與三層架構(gòu)毫無(wú)關(guān)系,就是常用的開(kāi)發(fā)模式中存放類(lèi)(Class)的文件夾。 其次,當(dāng)使用三層架構(gòu)時(shí),一定是在大項(xiàng)目中,因?yàn)槿龑蛹軜?gòu)的目的是提高項(xiàng)目的松散性和降低項(xiàng)目的耦合度,使之更容易擴(kuò)展或者維護(hù)。小項(xiàng)目使用了三層架構(gòu),由于過(guò)度的在意分層而導(dǎo)致了項(xiàng)目的復(fù)雜度增加。 創(chuàng) 建三層架構(gòu)的應(yīng)用程序。我們必須對(duì)這三層分別創(chuàng)建不同的類(lèi)庫(kù)(ClassLibrary),而不是普通的類(lèi)(Class)。我們對(duì)于任何一個(gè)模塊或者功能 進(jìn)行OOP,把它擴(kuò)展為對(duì)象(面向?qū)ο蟮乃枷刖褪牵簩⑺僮鞯哪繕?biāo)當(dāng)成一個(gè)對(duì)象,對(duì)它進(jìn)行的操作,將由對(duì)象自己的方法進(jìn)行,而非外界傳參。譬如注冊(cè)用戶, 用面向過(guò)程的方法事先,就是:public static bool Register(string userName, string userPwd)。若用OO的思想,我們不可將賬號(hào)密碼作為參數(shù)傳入,而是將用戶作為一個(gè)對(duì)象,這個(gè)對(duì)象具有private _userName,和private _userPwd的屬性。在注冊(cè)時(shí),用構(gòu)造函數(shù)初始化一個(gè)新的對(duì)象,User one = new User(userName,userPwd),使之在初始化后具有這兩個(gè)字段的值。然后調(diào)用User類(lèi)中的public static bool Register()方法(注意這個(gè)方法是不進(jìn)行傳參的),而在這個(gè)Register方法中,使用對(duì)象的_userName和_userPwd屬性進(jìn)行注 冊(cè)。),那么,我們?cè)谶@個(gè)對(duì)象中的任何操作都將以該對(duì)象的方法(函數(shù))實(shí)現(xiàn)。 在進(jìn)行三層分類(lèi)時(shí),這樣新建類(lèi)庫(kù)。 1.文件->新建項(xiàng)目->其他項(xiàng)目類(lèi)型->空白解決方案。 2. 在右側(cè)的“資源管理器”中,選中當(dāng)前解決方案,右鍵添加->新建項(xiàng)目->類(lèi)庫(kù)(ClassLibrary),分別創(chuàng)建BLL,DAL,UL類(lèi) 庫(kù)。(若添加后看不到解決方案則在菜單->工具->選項(xiàng)->項(xiàng)目和解決方案->總是顯示解決方案)。 3.右鍵,向解決方案中添加一個(gè)網(wǎng)站(新網(wǎng)站或者現(xiàn)有網(wǎng)站)。 4.根據(jù)需求刪除或者保留默認(rèn)添加項(xiàng)(默認(rèn)的class1.cs或Default.aspx文件)。 這樣一個(gè)三層架構(gòu)的網(wǎng)站雛形就搭建好了。因?yàn)閁I層要被其他兩層引用,DAL層要被BLL層引用。所以需要相互添加引用,方法是在類(lèi)庫(kù)上點(diǎn)擊右鍵->添加引用->項(xiàng)目->選擇其他類(lèi)庫(kù)。并且在具體類(lèi)中引入命名空間(using namespace)。 ps: 類(lèi)庫(kù)其實(shí)就是類(lèi)的集合,三層架構(gòu)的目的就是,將同一項(xiàng)目的不同模塊都劃分為各自的三層,各司其職,將具體實(shí)現(xiàn)方法用類(lèi)寫(xiě)出,添加到該層的類(lèi)庫(kù)中,這樣,一 個(gè)網(wǎng)站下的類(lèi)庫(kù)就只有三層,每一層中都包含了各個(gè)模塊相對(duì)應(yīng)層的實(shí)現(xiàn)方法。在以后修改或擴(kuò)展時(shí),在對(duì)應(yīng)層中進(jìn)行操作就可以了。 一 般的項(xiàng)目,涉及最多的就是對(duì)數(shù)據(jù)庫(kù)的CRUD,DAL層只負(fù)責(zé)與數(shù)據(jù)庫(kù)的交互,BLL層是最重要的一層,他負(fù)責(zé)將DAL層的的結(jié)果呈現(xiàn)給UI層,但是恰恰 BLL層的存在似乎有點(diǎn)雞肋,他起到的僅僅是轉(zhuǎn)發(fā)DAL層數(shù)據(jù)的作用,而具體的邏輯操作是與數(shù)據(jù)庫(kù)的交互,應(yīng)該寫(xiě)在DAL層,這就好像BLL層是在重復(fù) DAL層的勞動(dòng)一樣,其實(shí)BLL層的作用在于除了調(diào)用DAL層訪問(wèn)數(shù)據(jù)庫(kù),還可以進(jìn)行邏輯判斷,當(dāng)符合的時(shí)候,才進(jìn)行允許進(jìn)行DAL的操作,或者進(jìn)行額外 的操作(如加密,轉(zhuǎn)換等)。而DAL層可不管這些,他只管進(jìn)行CRUD的動(dòng)作。UI層就是操作抽象出來(lái)的實(shí)體對(duì)象,它包含了各種屬性。 一個(gè)三層架構(gòu)的小例子:注冊(cè)新用戶。 先寫(xiě)模塊的實(shí)體類(lèi),是數(shù)據(jù)庫(kù)中表的抽象,假設(shè)數(shù)據(jù)庫(kù)中注冊(cè)信息只有賬號(hào),密碼兩個(gè)字段。那么抽象到實(shí)體類(lèi)就是這樣:
再寫(xiě)DAL層:
再寫(xiě)B(tài)LL層:
最后構(gòu)建UI層代碼,即我們的aspx.cs頁(yè)面代碼,該層應(yīng)該直接調(diào)用BLL層的方法。該頁(yè)面引用BLL和Entity的命名空間,并向Button控件注冊(cè)事件:
這樣一個(gè)小的三層架構(gòu)程序就出來(lái)了。 這個(gè)程序中,操作的實(shí)體為UserInfo表的抽象。在DAL層進(jìn)行了AddUser()的方法,在BLL層也進(jìn)行了AddUser()的方法,唯一的區(qū)別是BLL層做了邏輯判斷,如果用戶名存在,則注冊(cè)失敗。 三層架構(gòu)的特點(diǎn): 1.數(shù)據(jù)庫(kù)訪問(wèn)層(DAL)僅提供對(duì)數(shù)據(jù)庫(kù)的CRUD操作,而不管操作后的結(jié)果,也不管邏輯過(guò)程(譬如同名用戶,不合法用戶名)。 2.業(yè)務(wù)邏輯層(BLL)不會(huì)直接與數(shù)據(jù)庫(kù)交互,他與數(shù)據(jù)庫(kù)的交互是通過(guò)DAL提供的方法。在調(diào)用這些方法前,要加入自己的邏輯判斷或者業(yè)務(wù)處理。另外業(yè)務(wù)邏輯層(BLL)還有可能不會(huì)去調(diào)用DAL層的方法,而是進(jìn)行其他業(yè)務(wù)處理。 3.用戶界面層(UI)層是不會(huì)調(diào)用DAL層的,他只調(diào)用BLL層提供的方法,再由BLL層自己決定是否繼續(xù)調(diào)用DAL層。 這個(gè)例子可以看出三層架構(gòu)的優(yōu)點(diǎn)就是結(jié)構(gòu)清晰,容易擴(kuò)展與維護(hù)。缺點(diǎn)就是,復(fù)雜。僅僅一個(gè)注冊(cè)用戶,就這么麻煩,所以對(duì)于小項(xiàng)目來(lái)說(shuō),費(fèi)這么大勁換取一個(gè)相對(duì)較清晰的分層結(jié)構(gòu)是不劃算的。 |
|
來(lái)自: 昵稱(chēng)39360 > 《我的圖書(shū)館》