1.1 3層架構(gòu)簡介
假設(shè)你在經(jīng)營1個大飯店,大體上你會請3方面的人,1方面是負(fù)責(zé)飯店服務(wù)的服務(wù)員,1方面是負(fù)責(zé)烹飪、做飯的廚師,1方面是負(fù)責(zé)飯店蔬菜、肉類、調(diào)料等的采購員。
如果你這樣做了,那末飯店管理起來,就好比較好管理(簡單來講)。比如任何1方面的員工出現(xiàn)請假或離職的情況,可以找其他的服務(wù)員、廚師或采購員代替。
在企業(yè)中這類職責(zé)分離、業(yè)務(wù)獨(dú)立的部門劃分方法對管理企業(yè)有很大的好處,一樣在程序中也需采取“職責(zé)分離、業(yè)務(wù)獨(dú)立的”的原則劃分模塊,更好的實(shí)現(xiàn)“高內(nèi)聚、低耦合”的軟件設(shè)計(jì)思想。
1.2為何要使用3層架構(gòu)
那末我們?yōu)楹我褂梅謱娱_發(fā)呢,它有甚么獨(dú)特的優(yōu)勢呢?
.NET開發(fā)平臺為我們做開發(fā)提供了強(qiáng)大的技術(shù)支持,使我們的開發(fā)變得非常便捷,高效。通過code behind的強(qiáng)大支持,我們可以將頁面設(shè)計(jì)和代碼設(shè)計(jì)有效的分離,代碼編寫,頁面設(shè)計(jì)同時進(jìn)行。
的確,僅從功能實(shí)現(xiàn)的基礎(chǔ)來講我們已做得很好了,特別對1個簡單的利用來講,代碼量不是很多的情況下,這類1層結(jié)構(gòu)開發(fā)完全夠用了,沒有必要弄得那末復(fù)雜。但是對1個復(fù)雜的大型系統(tǒng)來講這樣的設(shè)計(jì)的缺點(diǎn)就很嚴(yán)重了。
在開發(fā)進(jìn)程中我們會不停把代碼到處復(fù)制,以實(shí)現(xiàn)1些相似的功能。一樣的代碼為何要寫那末屢次?不但使程序變得冗雜,更不利于保護(hù),1個小小的修改也許會波及很多頁面。略微不留心就會致使異常的產(chǎn)生,使程序不能正常運(yùn)行。最主要的面向?qū)ο蟮乃枷霙]有得到絲毫的體現(xiàn),打著面向?qū)ο蟮幕献訁s仍然走著面向進(jìn)程的老路。
意想到這樣的問題,我開始將程序中1些公用的處理程序?qū)懗晒卜椒ǚ庋b在類中,供其它程序調(diào)用。象1些功能型的代碼集合,數(shù)據(jù)庫操作,猶如SqlHelper那樣對數(shù)據(jù)操作進(jìn)行公道封裝,把sql語句,參數(shù)列表作為參數(shù),在數(shù)據(jù)庫操作進(jìn)程中,只要傳入相應(yīng)的參數(shù)就能夠完成特定的數(shù)據(jù)操作,這就是我1開始的數(shù)據(jù)訪問層,再不用每次操作數(shù)據(jù)庫時都寫那些重復(fù)性的數(shù)據(jù)庫操作代碼。在新的利用開發(fā)中,數(shù)據(jù)訪問層可以直接拿來用。
面向?qū)ο蟮?大特性之1的封裝性在這里得到了很好的體現(xiàn)。似乎找到了面向?qū)ο蟮母杏X,代碼量較之前有了很大的減少,而且修改的時候也比較方便。這下應(yīng)當(dāng)可以了吧?
試問1下,如果有1天數(shù)據(jù)庫供應(yīng)商產(chǎn)生了變化,由于數(shù)據(jù)量的增加,數(shù)據(jù)庫有access變成了sql server?這下麻煩大了,原來的數(shù)據(jù)訪問層失效了,數(shù)據(jù)操作對象產(chǎn)生了變化,且頁面中觸及數(shù)據(jù)對象的地方也要進(jìn)行修改,由于原來可能會使用OleDbDataReader對象將數(shù)據(jù)傳遞給顯示頁面,現(xiàn)在都得換成SqlDataReader對象,sql和access支持的數(shù)據(jù)類型也不1致,在顯示數(shù)據(jù)時進(jìn)行的數(shù)據(jù)轉(zhuǎn)換可能也要進(jìn)行修改。由sql向access的轉(zhuǎn)換所做的修改會更多。
還有1種情況,由于某種需要,我們要把Web情勢的項(xiàng)目改造成windows利用,這時候牽涉的修改有多大呢?如果在你的aspx.cs中放了很多處理代碼,或還有1部份代碼存在于aspx中呢windows利用中可沒有aspx阿,是否是全部系統(tǒng)需要重新來做了?這都是設(shè)計(jì)不公道惹的禍。
1.3 3層架構(gòu)的構(gòu)成
我們通常說的3層架構(gòu)包括表示層、業(yè)務(wù)層和數(shù)據(jù)層3層,對利用系統(tǒng)來講,表示層和用戶交互并顯示數(shù)據(jù),業(yè)務(wù)層負(fù)責(zé)訪問數(shù)據(jù)層并向表示層提交數(shù)據(jù),數(shù)據(jù)層負(fù)責(zé)數(shù)據(jù)的存儲。下面來詳細(xì)論述3層架構(gòu)的含義及其組成:
n 表示層
它主要是指與用戶交互的界面,它接收用戶的輸入,但其實(shí)不包括任何實(shí)際的業(yè)務(wù)處理,它只是簡單地講數(shù)據(jù)轉(zhuǎn)交給業(yè)務(wù)層,同時負(fù)責(zé)展現(xiàn)業(yè)務(wù)層傳遞過來的數(shù)據(jù),當(dāng)后臺業(yè)務(wù)邏輯更新時,表示層就會顯示這些更新。表示層提供利用程序的用戶界面(UI),通常包括Windows窗體、Asp.NetWeb窗體。
n 業(yè)務(wù)層
它代表了利用程序的核心功能,負(fù)責(zé)處理數(shù)據(jù)層的數(shù)據(jù),實(shí)現(xiàn)業(yè)務(wù)邏輯,用于實(shí)現(xiàn)某種規(guī)則的業(yè)務(wù)處理以匹配特定公司的需要。例如,肯定某個指定客戶是不是被批準(zhǔn)進(jìn)行某項(xiàng)借貸活動的業(yè)務(wù)規(guī)則可以封裝在小型解決方案的客戶業(yè)務(wù)組件中。對大型解決方案,所有與借貸有關(guān)的業(yè)務(wù)邏輯可能都封裝在單獨(dú)的1個借貸組件中。
n 數(shù)據(jù)層
數(shù)據(jù)訪問層:有時候也稱為是持久層,其功能主要是負(fù)責(zé)數(shù)據(jù)庫的訪問,可以訪問數(shù)據(jù)庫系統(tǒng)、2進(jìn)制文件、文本文檔或是XML文檔。簡單的說法就是實(shí)現(xiàn)對數(shù)據(jù)表的Select,Insert,Update,Delete的操作。如果要加入ORM的元素,那末就會包括對象和數(shù)據(jù)表之間的mapping,和對象實(shí)體的持久化。
將3層架構(gòu)與飯店的各個人員層相比較的圖以下:
3層結(jié)構(gòu)的優(yōu)點(diǎn)
1)從開發(fā)角度和利用角度來看,3層架構(gòu)比雙層或單層結(jié)構(gòu)都有更大的優(yōu)勢。3層結(jié)構(gòu)合適群體開發(fā),每人可以有不同的分工,協(xié)同工作使效力倍增。開發(fā)雙層或單層利用時,每一個開發(fā)人員都應(yīng)對系統(tǒng)有較深的理解,能力要求很高,開發(fā)3層利用時,則可以結(jié)合多方面的人材,只需少數(shù)人對系統(tǒng)全面了解,從1定程度工下降了開發(fā)的難度
2)3層架構(gòu)可以更好的支持散布式計(jì)算環(huán)境。邏輯層的利用程序可以有多個機(jī)器上運(yùn)行,充分利用網(wǎng)絡(luò)的計(jì)算功能。散布式計(jì)算的潛力巨大,遠(yuǎn)比升級CPU有效。美國人曾利用分式計(jì)算解密,幾個月就破解了據(jù)稱永久都破不了的密碼
3)也是3層架構(gòu)的最大優(yōu)點(diǎn)是它的安全性。用戶端只能通過邏輯層來訪問數(shù)據(jù)層,減少了入口點(diǎn),把很多危險的系統(tǒng)功能都屏蔽了
3層結(jié)構(gòu)的缺點(diǎn)
“金無足赤,人無完人”,分層式結(jié)構(gòu)也不可避免具有1些缺點(diǎn):
1、下降了系統(tǒng)的性能。這是不言而喻的。如果不采取分層式結(jié)構(gòu),很多業(yè)務(wù)可以直接造訪數(shù)據(jù)庫,以此獲得相應(yīng)的數(shù)據(jù),如今卻必須通過中間層來完成。
2、有時會致使級聯(lián)的修改。這類修改特別體現(xiàn)在自上而下的方向。如果在表示層中需要增加1個功能,為保證其設(shè)計(jì)符合分層式結(jié)構(gòu),可能需要在相應(yīng)的業(yè)務(wù)邏輯層和數(shù)據(jù)訪問層中都增加相應(yīng)的代碼。
3層架構(gòu)的搭建
2.2點(diǎn)擊新建項(xiàng)—》,選擇,利用程序配置文件
2.3打開app.config文件后,寫以下代碼:
/*在此先弱化了,業(yè)務(wù)邏輯層*/
第6步:表示層
這樣,全部完全、簡單的3層框架登錄已基本完成。
請沒有完成的同學(xué)依照此步驟,務(wù)必做完。體驗(yàn)3層框架之間類的調(diào)用與關(guān)系。
/*針對3層當(dāng)中的各個“相干責(zé)任類”,添加斷點(diǎn),進(jìn)行測試,看看參數(shù)傳遞效果。*/
下面同學(xué)們,連接項(xiàng)目組長的數(shù)據(jù)庫服務(wù)器。
打開TCP/IP和其他服務(wù)
小結(jié):
n 3層結(jié)構(gòu)與兩層結(jié)構(gòu)的區(qū)分是甚么?
n 為何要實(shí)現(xiàn)分層?各層的作用是甚么?
n 3層結(jié)構(gòu)中各層之間相互依賴是如何實(shí)現(xiàn)的?
作業(yè):
自己根據(jù)之前坐的賓館管理系統(tǒng)、汽車銷售系統(tǒng)等C/S系統(tǒng),根據(jù)3層架構(gòu)的思想,重新搭建新的框架。