




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、AS 剖析三層架構(gòu)本文不是從理論的角度來(lái)探討三層架構(gòu),而是用一個(gè)示例來(lái)介紹如何建設(shè)一個(gè)三層架構(gòu)的項(xiàng)目,并說(shuō)明項(xiàng)目中各個(gè)文件所處的層次與作用。寫(xiě)本文的目的,不是為了說(shuō)明自己的這個(gè)方法有多對(duì),別人的肯定不對(duì),而是希望給那些初學(xué)三層架構(gòu)卻不知從何入手的朋友提供一點(diǎn)幫助。因?yàn)榫W(wǎng)上的文章,大多是注重理論的介紹,而忽略了具體的實(shí)踐應(yīng)用,或者有示例但講得不透徹。導(dǎo)致看了之后,理論上又學(xué)習(xí)了一遍,但還是不知道代碼怎么寫(xiě)。所以想從這個(gè)方面入手寫(xiě)一下,讓從來(lái)沒(méi)做過(guò)三層架構(gòu)的初學(xué)者也能照貓畫(huà)虎,寫(xiě)出代碼來(lái)。文章表述的是筆者個(gè)人對(duì)三層架構(gòu)的認(rèn)識(shí),肯定有許多不足的地方,歡迎大家指正,小弟也會(huì)根據(jù)反饋來(lái)修改這篇
2、文章。文中的代碼是偽代碼,僅用來(lái)闡明思路。 正文: 一提三層架構(gòu),大家都知道是表現(xiàn)層(UI),業(yè)務(wù)邏輯層(BLL)和數(shù)據(jù)訪問(wèn)層(DAL),而且每層如何細(xì)分也都有很多的方法。但具體代碼怎么寫(xiě),到底那些文件算在哪一層,卻是模模糊糊的。下面用一個(gè)簡(jiǎn)單的例子來(lái)帶領(lǐng)大家實(shí)戰(zhàn)三層架構(gòu)的項(xiàng)目,這個(gè)例子只有一個(gè)功能,就是用戶的簡(jiǎn)單管理。 首先建立一個(gè)空白解決方案,添加如下項(xiàng)目及文件1、添加ASP.NET Web Application項(xiàng)目,命名為UI,新建Web Form類(lèi)型文件User.aspx(含User.aspx.cs)2、添
3、加ClassLibrary項(xiàng)目,命名為BLL,新建Class類(lèi)型文件UserBLL.cs3、添加ClassLibrary項(xiàng)目,命名為DAL,新建Class類(lèi)型文件UserDAL.cs。添加SQLHelper引用。(這個(gè)是微軟的數(shù)據(jù)訪問(wèn)類(lèi),也可以不用,直接編寫(xiě)所有的數(shù)據(jù)訪問(wèn)代碼。我一般用自己寫(xiě)的數(shù)據(jù)訪問(wèn)類(lèi)DataAccessHelper )。4、添加ClassLibrary項(xiàng)目,命名為Model,新建Class類(lèi)型文件UserModel.cs5、添加ClassLibrary項(xiàng)目,命名為IDAL,新建Interface類(lèi)型文件IUserDAL.cs6、添加ClassLibrary項(xiàng)目,命名為Cla
4、ssFactory相信大家已經(jīng)看出來(lái)了,這個(gè)和Petshop的示例沒(méi)什么區(qū)別,而且更簡(jiǎn)單,因?yàn)樵谙乱彩峭ㄟ^(guò)Petshop學(xué)習(xí)三層架構(gòu)的。但一些朋友對(duì)于這幾個(gè)項(xiàng)目所處的層次,以及它們之間的關(guān)系,可能比較模糊,這里逐個(gè)說(shuō)明一下:1、User.aspx和User.aspx.cs這兩個(gè)文件(以及文件所屬的項(xiàng)目,下面也是如此,不再重復(fù)強(qiáng)調(diào)了)都屬于表現(xiàn)層部分。User.aspx比較好理解,因?yàn)樗褪秋@示頁(yè)面了。User.aspx.cs有些人覺(jué)得不應(yīng)該算,而是要?jiǎng)澋綐I(yè)務(wù)邏輯層中去。如果不做分層的話,那么讓User.aspx.cs來(lái)處理業(yè)務(wù)邏輯,甚至操作數(shù)據(jù)庫(kù)都沒(méi)什么問(wèn)題,但是做分層的話,這樣就不應(yīng)該了。在
5、分層結(jié)構(gòu)中,User.aspx.cs僅應(yīng)該處理與顯示有關(guān)的內(nèi)容,其它部分都不應(yīng)該涉及。舉例:我們實(shí)現(xiàn)用列表方式顯示用戶的功能,那么提取信息的工作是由BLL來(lái)做的,UI(本例中是User.aspx.cs)調(diào)用BLL得到UserInfo后,通過(guò)代碼綁定到User.aspx的數(shù)據(jù)控件上,就實(shí)現(xiàn)了列表的顯示。在此過(guò)程中User.aspx.cs對(duì)UI沒(méi)有起到什么作用,僅是用來(lái)傳遞數(shù)據(jù),而且因?yàn)閷?shí)際編碼中大部分情況都是如此的實(shí)現(xiàn),所以使有些人覺(jué)得User.aspx.cs不應(yīng)該算UI,而應(yīng)該并入BLL負(fù)責(zé)邏輯處理。繼續(xù)往下看,這時(shí)提出了一個(gè)新需求,要求在每個(gè)用戶的前面加一個(gè)圖標(biāo),生動(dòng)地表現(xiàn)出用戶的性別,而且
6、不滿18歲的用兒童圖標(biāo)表示。這個(gè)需求的實(shí)現(xiàn),就輪到User.aspx.cs來(lái)做了,這種情況下User.aspx.cs才算有了真正的用途。2、NewBLL.cs添加如下方法:public IList<UserInfo> GetUsers():返回所有的用戶信息列表public UserInfo GetUser(int UserId):返回指定用戶的詳細(xì)信息public bool AddUser(UserInfo User):新增用戶信息public bool ChangeUser(UserInfo User):更新用戶信息public void RemoveUser(int User
7、Id):移除用戶信息此文件就屬于業(yè)務(wù)邏輯層了,專(zhuān)門(mén)用來(lái)處理與業(yè)務(wù)邏輯有關(guān)的操作??赡苡泻芏嗳擞X(jué)得這一層唯一的用途,就是把表現(xiàn)層傳過(guò)來(lái)的數(shù)據(jù)轉(zhuǎn)發(fā)給數(shù)據(jù)層。這種情況確實(shí)很多,但這只能說(shuō)明項(xiàng)目比較簡(jiǎn)單,或者項(xiàng)目本身與業(yè)務(wù)的關(guān)系結(jié)合的不緊密(比如當(dāng)前比較流行的MIS),所以造成業(yè)務(wù)層無(wú)事可做,只起到了一個(gè)轉(zhuǎn)發(fā)的作用。但這不代表業(yè)務(wù)層可有可無(wú),隨著項(xiàng)目的增大,或者業(yè)務(wù)關(guān)系比較多,業(yè)務(wù)層就會(huì)體現(xiàn)出它的作用來(lái)了。此處最可能造成錯(cuò)誤的,就是把數(shù)據(jù)操作代碼劃在了業(yè)務(wù)邏輯層,而把數(shù)據(jù)庫(kù)作為了數(shù)據(jù)訪問(wèn)層。舉例:有些朋友感覺(jué)BLL層意義不大,只是將DAL的數(shù)據(jù)提上來(lái)就轉(zhuǎn)發(fā)給了UI,而未作任何處理??匆幌逻@個(gè)例子BLL
8、層SelectUser(UserInfo userInfo)根據(jù)傳入的username或email得到用戶詳細(xì)信息。IsExist(UserInfo userInfo)判斷指定的username或email是否存在。然后DAL也相應(yīng)提供方法共BLL調(diào)用SelectUser(UserInfo userInfo)IsExist(UserInfo userInfo)這樣BLL確實(shí)只起到了一個(gè)傳遞的作用。但如果這樣做:BLL.IsExist(Userinfo userinfo) UerInfo user = DAL.SelectUser(User);return
9、 (userInfo.Id != null);那么DAL就無(wú)需實(shí)現(xiàn)IsExist()方法了,BLL中也就有了邏輯處理的代碼。3、UserModel.cs實(shí)體類(lèi),這個(gè)東西,大家可能覺(jué)得不好分層。包括我以前在內(nèi),是這樣理解的:UIßàModelßàBLLßàModelßàDAL,如此則認(rèn)為Model在各層之間起到了一個(gè)數(shù)據(jù)傳輸?shù)臉蛄鹤饔谩2贿^(guò)在這里,我們不是把事情想簡(jiǎn)單,而是想復(fù)雜了。Model是什么?它什么也不是!它在三層架構(gòu)中是可有可無(wú)的。它其實(shí)就是面向?qū)ο缶幊讨凶罨镜臇|西:類(lèi)。一個(gè)桌子是一個(gè)類(lèi),一條新聞也是一個(gè)
10、類(lèi),int、string、doublie等也是類(lèi),它僅僅是一個(gè)類(lèi)而已。這樣,Model在三層架構(gòu)中的位置,和int,string等變量的地位就一樣了,沒(méi)有其它的目的,僅用于數(shù)據(jù)的存儲(chǔ)而已,只不過(guò)它存儲(chǔ)的是復(fù)雜的數(shù)據(jù)。所以如果你的項(xiàng)目中對(duì)象都非常簡(jiǎn)單,那么不用Model而直接傳遞多個(gè)參數(shù)也能做成三層架構(gòu)。那為什么還要有Model呢,它的好處是什么呢。下面是思考一個(gè)問(wèn)題時(shí)想到的,插在這里: Model在各層參數(shù)傳遞時(shí)到底能起到做大的作用?在各層間傳遞參數(shù)時(shí),可以這樣:AddUser(userId,userName,userPassword,)也可以這樣:AddUser(us
11、erInfo)這兩種方法那個(gè)好呢。一目了然,肯定是第二種要好很多。什么時(shí)候用普通變量類(lèi)型(int,string,guid,double)在各層之間傳遞參數(shù),什么使用Model傳遞?下面幾個(gè)方法:SelectUser(int UserId)SelectUserByName(string username)SelectUserByName(string username,string password)SelectUserByEmail(string email)SelectUserByEmail(string email,string password)可以概括為:SelectUser(user
12、Id)SelectUser(user)這里用user這個(gè)Model對(duì)象囊括了username,password,email這三個(gè)參數(shù)的四種組合模式。UserId其實(shí)也可以合并到user中,但項(xiàng)目中其它BLL都實(shí)現(xiàn)了帶有id參數(shù)的接口,所以這里也保留這一項(xiàng)。傳入了userInfo,那如何處理呢,這個(gè)就需要按照先后的順序了,有具體代碼決定。這里按這個(gè)順序處理首先看是否同時(shí)具有username和password,然后看是否同時(shí)具有email和password,然后看是否有username,然后看是否有email。依次處理。這樣,如果以后增加一個(gè)新內(nèi)容,會(huì)員卡(number),則無(wú)需更改接口,只要在D
13、AL的代碼中增加對(duì)number的支持就行,然后前臺(tái)增加會(huì)員卡一項(xiàng)內(nèi)容的表現(xiàn)與處理即可。4、UserDAL.cspublic IList<UserInfo> SelectUsers():返回所有的用戶信息列表public UserInfo SelectUser(int UserId):返回指定用戶的相信信息public bool InsertUser(UserInfo User):新增用戶信息public bool UpdateUser(UserInfo User):更新用戶信息public void DeleteUser(int UserId):移除用戶信息很多人最鬧不清的就是數(shù)據(jù)
14、訪問(wèn)層,到底那部分才算數(shù)據(jù)訪問(wèn)層呢?有些認(rèn)為數(shù)據(jù)庫(kù)就是數(shù)據(jù)訪問(wèn)層,這是對(duì)定義沒(méi)有搞清楚,DAL是數(shù)據(jù)訪問(wèn)層而不是數(shù)據(jù)存儲(chǔ)層,因此數(shù)據(jù)庫(kù)不可能是這一層的。也有的把SQLHelper(或其同類(lèi)作用的組件)作為數(shù)據(jù)訪問(wèn)層,它又是一個(gè)可有可無(wú)的東西,SQLHelper的作用是減少重復(fù)性編碼,提高編碼效率,因此如果我習(xí)慣在乎效率或使用一個(gè)非數(shù)據(jù)庫(kù)的數(shù)據(jù)源時(shí),可以丟棄SQLHelper,一個(gè)可以隨意棄置的部分,又怎么能成為三層架構(gòu)中的一層呢??梢赃@樣定義:與數(shù)據(jù)源操作有關(guān)的代碼,就應(yīng)該放在數(shù)據(jù)訪問(wèn)層中,屬于數(shù)據(jù)訪問(wèn)層5、IUserDAL數(shù)據(jù)訪問(wèn)層接口,這又是一個(gè)可有可無(wú)的東西,因?yàn)镻etshop中帶了它和
15、ClassFactory類(lèi)工廠,所以有些項(xiàng)目不論需不需要支持多數(shù)據(jù)源,都把這兩個(gè)東西做了進(jìn)來(lái),有的甚至不建ClassFactory而只建了IDAL,然后“IUserDAL iUserDal = new UserDAL();”,不知意義何在。這就完全是畫(huà)虎不成反類(lèi)犬了。許多人在這里有一個(gè)誤解,那就是以為存在這樣的關(guān)系:BLLßàIDALßàDAL,認(rèn)為IDAL起到了BLL和DAL之間的橋梁作用,BLL是通過(guò)IDAL來(lái)調(diào)用DAL的。但實(shí)際是即使你如此編碼:“IUserDAL iUserDal = ClassFacotry.CreateUserDAL();”,那么在執(zhí)行“iUserDal.SelectUsers()”時(shí),其實(shí)還是執(zhí)行的UserDAL實(shí)例,而不是IUserDAL實(shí)例,所以IDAL在三層中的位置是與DAL平級(jí)的關(guān)系。通過(guò)上面的介紹,基本上將三層架構(gòu)的層次結(jié)構(gòu)說(shuō)明了。其實(shí),本人有一個(gè)判斷三層架構(gòu)是否標(biāo)準(zhǔn)的方法,那就是將三層中的任意一層完全替換,都不會(huì)對(duì)其它兩層造成影響,這樣的構(gòu)造基本就符合三層標(biāo)準(zhǔn)了(雖然實(shí)現(xiàn)起來(lái)比較難_)。例如如果將項(xiàng)目從B/S改為C/S(或相反),那么除了UI以
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 企業(yè)并購(gòu)重組財(cái)務(wù)顧問(wèn)與法律顧問(wèn)合作協(xié)議
- 能源企業(yè)財(cái)務(wù)預(yù)測(cè)與預(yù)算編制合同
- 公共車(chē)庫(kù)租賃與智能停車(chē)誘導(dǎo)系統(tǒng)升級(jí)合同
- 有限空間作業(yè)氣體報(bào)警
- 二外日本語(yǔ)優(yōu)秀テキスト
- 經(jīng)濟(jì)部門(mén)工作總結(jié)
- 吸煙有害健康大班公開(kāi)課
- 大學(xué)生心理健康與成長(zhǎng)
- 藥毒中醫(yī)護(hù)理方案
- 醫(yī)院新進(jìn)人員院感崗前培訓(xùn)
- 遼寧省沈陽(yáng)市沈北新區(qū)2024屆小升初考試數(shù)學(xué)試卷含解析
- 南京市指導(dǎo)服務(wù)企業(yè)安全生產(chǎn)工作指引-加油站現(xiàn)場(chǎng)安全重點(diǎn)檢查指引分冊(cè)
- AQ/T 2077-2020 頁(yè)巖氣井獨(dú)立式帶壓作業(yè)機(jī)起下管柱作業(yè)安全技術(shù)規(guī)范(正式版)
- 【8物(滬科版)】合肥市第四十五中學(xué)2023-2024學(xué)年八年級(jí)下學(xué)期期末物理試題
- 區(qū)域代理商合同模板
- 國(guó)家開(kāi)放大學(xué)(浙江)地域文化(本)作業(yè)1-5
- HG/T 2520-2023 工業(yè)亞磷酸 (正式版)
- 會(huì)所會(huì)員管理制度
- DZ/T 0462.8-2023 礦產(chǎn)資源“三率”指標(biāo)要求 第8部分:硫鐵礦、磷、硼、天然堿、鈉硝石(正式版)
- 廣東省廣州市海珠區(qū)2024年七年級(jí)下冊(cè)數(shù)學(xué)期末試卷附答案
- 湖南省長(zhǎng)沙市芙蓉區(qū)2022-2023學(xué)年一年級(jí)下學(xué)期期末測(cè)試數(shù)學(xué)試卷
評(píng)論
0/150
提交評(píng)論