《ASP.NET4.0程序設(shè)計(jì)案例教程》課件-第10章三層架構(gòu)_第1頁(yè)
《ASP.NET4.0程序設(shè)計(jì)案例教程》課件-第10章三層架構(gòu)_第2頁(yè)
《ASP.NET4.0程序設(shè)計(jì)案例教程》課件-第10章三層架構(gòu)_第3頁(yè)
《ASP.NET4.0程序設(shè)計(jì)案例教程》課件-第10章三層架構(gòu)_第4頁(yè)
《ASP.NET4.0程序設(shè)計(jì)案例教程》課件-第10章三層架構(gòu)_第5頁(yè)
已閱讀5頁(yè),還剩30頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第10章三層架構(gòu)本章學(xué)習(xí)目標(biāo)理解軟件架構(gòu)和分層的概念理解三層架構(gòu)的設(shè)計(jì)理念理解三層架構(gòu)的優(yōu)缺點(diǎn)學(xué)會(huì)ASP.NET三層架構(gòu)軟件的實(shí)現(xiàn)10.1 概述

10.1.1 軟件架構(gòu)和分層10.1.2 三層架構(gòu)簡(jiǎn)介10.1.3 三層架構(gòu)的優(yōu)缺點(diǎn)10.1.4三層架構(gòu)和MVC10.1.1 軟件架構(gòu)和分層1.軟件架構(gòu)軟件體系結(jié)構(gòu)是構(gòu)建計(jì)算機(jī)軟件實(shí)踐的基礎(chǔ)。與建筑師設(shè)定建筑項(xiàng)目的設(shè)計(jì)原則和目標(biāo),作為繪圖員畫圖的基礎(chǔ)一樣,一個(gè)軟件架構(gòu)師或者系統(tǒng)架構(gòu)師陳述軟件構(gòu)架以作為滿足不同客戶需求的實(shí)際系統(tǒng)設(shè)計(jì)方案的基礎(chǔ)。從和目的、主題、材料和結(jié)構(gòu)的聯(lián)系上來(lái)說(shuō),軟件架構(gòu)可以和建筑物的架構(gòu)相比擬。一個(gè)軟件架構(gòu)師需要有廣泛的軟件理論知識(shí)和相應(yīng)的經(jīng)驗(yàn)來(lái)實(shí)施和管理軟件產(chǎn)品的高級(jí)設(shè)計(jì)。軟件架構(gòu)師定義和設(shè)計(jì)軟件的模塊化,模塊之間的交互,用戶界面風(fēng)格,對(duì)外接口方法,創(chuàng)新的設(shè)計(jì)特性,以及高層事物的對(duì)象操作、邏輯和流程。2.分層層次系統(tǒng)風(fēng)格將軟件結(jié)構(gòu)組織成一個(gè)層次結(jié)構(gòu),一個(gè)分層系統(tǒng)是分層次組織的,每層對(duì)上層提供服務(wù),同時(shí)對(duì)下層來(lái)講也是一個(gè)服務(wù)的對(duì)象。在一些分層系統(tǒng)中,內(nèi)部的層只對(duì)相鄰的層可見(jiàn)。除了相鄰的外層或經(jīng)過(guò)挑選用于輸出的特定函數(shù)以外,內(nèi)層都被隱藏起來(lái)。這種風(fēng)格支持基于可增加抽象層的設(shè)計(jì)。由于每一層最多只影響兩層,同時(shí)只要給相鄰層提供相同的接口,允許每層用不同的方法實(shí)現(xiàn),同樣為軟件重用提供了強(qiáng)大的支持。10.1.1 軟件架構(gòu)和分層3.物理分層和邏輯分層軟件的分層包含兩種含義:一種是物理分層,即每一層都運(yùn)行在單獨(dú)的機(jī)器上,這意味著創(chuàng)建分布式的軟件系統(tǒng);一種是邏輯分層,指的是在單個(gè)軟件模塊中完成特定的功能。界面層、業(yè)務(wù)邏輯層和數(shù)據(jù)庫(kù)訪問(wèn)層運(yùn)行在同一臺(tái)機(jī)器上,這臺(tái)機(jī)器即是應(yīng)用服務(wù)器。數(shù)據(jù)庫(kù)軟件安裝在另外一臺(tái)機(jī)器上,這臺(tái)機(jī)器稱為數(shù)據(jù)庫(kù)服務(wù)器,因此整個(gè)系統(tǒng)物理上分為兩層,而邏輯上分為三層結(jié)構(gòu)。4.分層系統(tǒng)體系結(jié)構(gòu)的優(yōu)缺點(diǎn)適當(dāng)?shù)臑檐浖謱?,將?huì)提高軟件的以下性能。1) 伸縮性(指應(yīng)用程序是否支持更多的用戶)。2) 可維護(hù)性(指的是當(dāng)發(fā)生需求變化,只需修改軟件的某一部分,不會(huì)影響其它部分的代碼。層數(shù)越多,可維護(hù)性也會(huì)不斷提高)。3) 可擴(kuò)展性(指的是在現(xiàn)有系統(tǒng)中增加新功能的難易程度)層數(shù)越少,增加新功能就越容易破壞現(xiàn)有的程序結(jié)構(gòu)。層數(shù)越多,就可以在每個(gè)層中提供擴(kuò)展點(diǎn),不會(huì)打破應(yīng)用的整體框架。4) 可重用性(指的是程序代碼沒(méi)有冗余,同一個(gè)程序能滿足各種需求)。5) 可管理性(管理系統(tǒng)的難易程度)。軟件分層的缺點(diǎn):1) 軟件分層越多,對(duì)軟件設(shè)計(jì)人員的要求就越高。在設(shè)計(jì)階段,必須花時(shí)間構(gòu)思合理的體系結(jié)構(gòu)。2) 軟件層越多,調(diào)試會(huì)越困難。如果應(yīng)用規(guī)模比較小,業(yè)務(wù)邏輯很簡(jiǎn)單,軟件層數(shù)少反而會(huì)簡(jiǎn)化開(kāi)發(fā)流程并提高開(kāi)發(fā)效率。10.1.1 軟件架構(gòu)和分層5.設(shè)計(jì)分層的原則1) 實(shí)現(xiàn)和接口分離原則,這是對(duì)所有模塊接口的一個(gè)通用原則。不同的層次實(shí)際上是不同的模塊,只不過(guò)這些模塊在邏輯關(guān)系上有上下的依賴關(guān)系。在這個(gè)分離原則之下,層次之間的互換性就可以得到保證。對(duì)于一般的軟件設(shè)計(jì)來(lái)說(shuō),最常見(jiàn)的是抽象層,即把應(yīng)用部分與一些具體的實(shí)現(xiàn)分離開(kāi)來(lái)。2) 單向性原則,軟件的分層應(yīng)該是單向的,即只能上層調(diào)用下層,反過(guò)來(lái)通常是不行的。因?yàn)樯蠈诱{(diào)用下層,結(jié)果是上層離不開(kāi)下層,但下層可以獨(dú)立地存在:如果下層同時(shí)調(diào)用上層,上下層就緊密地耦合在一起,誰(shuí)也離不開(kāi)誰(shuí),形成了軟件中的共生現(xiàn)象,導(dǎo)致模塊的互換性和可重用性就得不到保證。3) 服務(wù)接口的粒度提升原則,每層的存在應(yīng)該是為了完成一定的使用,從軟件設(shè)計(jì)和程序編寫的角度來(lái)講,應(yīng)該向上一層提供更加方便快捷的服務(wù)接口。簡(jiǎn)單重復(fù)下一層功能的層是沒(méi)有意義的,一般越往上層服務(wù)接口的粒度越大。對(duì)很多應(yīng)用軟件來(lái)說(shuō),在與數(shù)據(jù)庫(kù)直接打交道的地方有數(shù)據(jù)抽象層。該層把上層的應(yīng)用同具體的數(shù)據(jù)庫(kù)引擎分離開(kāi)來(lái)。在此之上,建立業(yè)務(wù)對(duì)象層(businessobject),把具體的業(yè)務(wù)邏輯反映到該層次上。再往上是交互的用戶界面等。多層結(jié)構(gòu)系統(tǒng)具有良好的可拓展性、可維護(hù)性和穩(wěn)定的系統(tǒng)質(zhì)量,同時(shí),可以提高軟件的可重用性,節(jié)省項(xiàng)目的開(kāi)發(fā)時(shí)間。在開(kāi)發(fā)中,具體采取幾層構(gòu)架,可根據(jù)系統(tǒng)的業(yè)務(wù)繁簡(jiǎn)程度靈活運(yùn)用。10.1.2 三層架構(gòu)簡(jiǎn)介在軟件項(xiàng)目開(kāi)發(fā)的過(guò)程中,比較常見(jiàn)的是把整個(gè)項(xiàng)目分為三層架構(gòu),其中包括:表示層(UserInterface,UI)業(yè)務(wù)邏輯層(BusinessLogicLayer,BLL)數(shù)據(jù)訪問(wèn)層(DataAccessLayer,DAL)10.1.3 三層架構(gòu)的優(yōu)缺點(diǎn)優(yōu)點(diǎn):1) 開(kāi)發(fā)人員可以只關(guān)注整個(gè)結(jié)構(gòu)中的其中某一層;2) 可以很容易的用新的實(shí)現(xiàn)來(lái)替換原有層次的實(shí)現(xiàn);3) 可以降低層與層之間的依賴;4) 有利于標(biāo)準(zhǔn)化;5) 利于各層邏輯的復(fù)用;6) 結(jié)構(gòu)更加的明確;7) 在后期維護(hù)的時(shí)候,極大地降低了維護(hù)成本和維護(hù)時(shí)間。缺點(diǎn):1) 降低了系統(tǒng)的性能。這是不言而喻的。如果不采用分層式結(jié)構(gòu),很多業(yè)務(wù)可以直接造訪數(shù)據(jù)庫(kù),以此獲取相應(yīng)的數(shù)據(jù),如今卻必須通過(guò)中間層來(lái)完成;2) 有時(shí)會(huì)導(dǎo)致級(jí)聯(lián)的修改。這種修改尤其體現(xiàn)在自上而下的方向。如果在表示層中需要增加一個(gè)功能,為保證其設(shè)計(jì)符合分層式結(jié)構(gòu),可能需要在相應(yīng)的業(yè)務(wù)邏輯層和數(shù)據(jù)訪問(wèn)層中都增加相應(yīng)的代碼。10.1.4三層架構(gòu)和MVCMVC全名是ModelViewController,是模型(Model)-視圖(View)-控制器(Controller)的縮寫,一種軟件設(shè)計(jì)典范,用于組織代碼用一種業(yè)務(wù)邏輯和數(shù)據(jù)顯示分離的方法,這個(gè)方法的假設(shè)前提是如果業(yè)務(wù)邏輯被聚集到一個(gè)部件里面,而且界面和用戶圍繞數(shù)據(jù)的交互能被改進(jìn)和個(gè)性化定制而不需要重新編寫業(yè)務(wù)邏輯。MVC被獨(dú)特的發(fā)展起來(lái)用于映射傳統(tǒng)的輸入、處理和輸出功能在一個(gè)邏輯的圖形化用戶界面的結(jié)構(gòu)中。在三層架構(gòu)中,一般也會(huì)有一個(gè)Model層,用來(lái)與數(shù)據(jù)庫(kù)的表相對(duì)應(yīng),也就是所謂ORM(ObjectRelationalMapping,對(duì)象關(guān)系映射)中的Objet。這個(gè)Model是包含一些屬性信息的的實(shí)體類,這些實(shí)體類中一般不包含數(shù)據(jù)讀取。MVC主要用于表現(xiàn)層,三層主要用于體系架構(gòu),三層一般是表現(xiàn)層、業(yè)務(wù)邏輯層、數(shù)據(jù)訪問(wèn)層,其中表現(xiàn)層又可以分成M、V、C,(ModelViewController)模型-視圖-控制器。MVC模式是一種復(fù)合設(shè)計(jì)模式,一種在特定場(chǎng)合用于解決某種實(shí)際問(wèn)題來(lái)得出的可以反復(fù)實(shí)踐的解決方案。巧合的是它也有三個(gè)事物組成,于是乎人們就有了一種想當(dāng)然的對(duì)應(yīng)關(guān)系:展示層-View;業(yè)務(wù)邏輯層-Control;持久層-Model。首先MVC中的三個(gè)事物之間并不存在明顯的層次結(jié)構(gòu),沒(méi)有明顯的向下依賴關(guān)系,相反的,View和Model往往是比較獨(dú)立的,而Control是連接兩者的橋梁,他們更像是橫向的切分。這樣一來(lái)就出現(xiàn)一個(gè)結(jié)果,MVC中每個(gè)塊都是可以獨(dú)立測(cè)試的,而三層結(jié)構(gòu)中,上層模塊的運(yùn)行測(cè)試需要下次代碼提供接口。相對(duì)來(lái)說(shuō),MVC復(fù)雜得多,但是結(jié)構(gòu)更清晰,耦合性更低。10.2 三層架構(gòu)系統(tǒng)的實(shí)現(xiàn)

10.2.1 實(shí)體層10.2.2 數(shù)據(jù)訪問(wèn)層10.2.3 業(yè)務(wù)邏輯層10.2.4 表示層10.2.1 實(shí)體層實(shí)體類是現(xiàn)實(shí)實(shí)體在計(jì)算機(jī)中的表示。它貫穿于整個(gè)架構(gòu),負(fù)擔(dān)著在各層次及模塊間傳遞數(shù)據(jù)的職責(zé)。一般來(lái)說(shuō),實(shí)體類可以分為“貧血實(shí)體類”和“充血實(shí)體類”,前者僅僅保存實(shí)體的屬性,而后者還包含一些實(shí)體間的關(guān)系與邏輯。大多情況下,實(shí)體類和數(shù)據(jù)庫(kù)中的表(這里指實(shí)體表,不包括表示多對(duì)多對(duì)應(yīng)的關(guān)系表)是一一對(duì)應(yīng)的,但這并不是一個(gè)限制,在復(fù)雜的數(shù)據(jù)庫(kù)設(shè)計(jì)中,有可能出現(xiàn)一個(gè)實(shí)體類對(duì)應(yīng)多個(gè)表,或者交叉對(duì)應(yīng)的情況。10.2.1 實(shí)體層管理員表(TAdmin)、留言表(TMessage)字段名稱字段類型字段說(shuō)明是否為空備注IDInt管理員IDNotNull主鍵,自增Namevarchar(20)登錄名NotNull

Passwordvarchar(50)登錄密碼NotNull使用MD5加密

字段名稱字段類型字段說(shuō)明是否為空備注IDInt留言IDNotNull主鍵,自增GuestNamevarchar(20)留言者用戶名NotNull

GuestEmailvarchar(100)留言者E-mailNull

ContentText留言內(nèi)容NotNull

TimeDatetime發(fā)表留言時(shí)間NotNull

ReplyText回復(fù)Null

10.2.1 實(shí)體層評(píng)論表(TComment)字段名稱字段類型字段說(shuō)明是否為空備注IDint評(píng)論IDNotNull主鍵,自增Contenttext評(píng)論內(nèi)容NotNull

Timedatetime發(fā)表評(píng)論時(shí)間NotNull

MessageIDint所屬留言的ID

外鍵

10.2.1 實(shí)體層整個(gè)系統(tǒng)初期包括6個(gè)工程,每個(gè)工程的主要作用為:

MessageBoard——Web網(wǎng)站,表示層;

Entity——項(xiàng)目類型為類庫(kù),存放實(shí)體類;

Factory——項(xiàng)目類型為類庫(kù),存放和依賴注入及IoC相關(guān)的類;

IBLL——項(xiàng)目類型為類庫(kù),存放業(yè)務(wù)邏輯層接口;

IDAL——項(xiàng)目類型為類庫(kù),存放數(shù)據(jù)訪問(wèn)層接口;

Utility——項(xiàng)目類型為類庫(kù),存放各種工具類及輔助類;10.2.1 實(shí)體層在Entity工程中,包含了AdminInfo,MessageInfo,CommentInfo三個(gè)實(shí)體類Serializable(序列化)的attribute,是為了利用序列化的技術(shù)準(zhǔn)備用于序列化的對(duì)象必須設(shè)置[System.Serializable]標(biāo)簽,該標(biāo)簽指示一個(gè)類可以序列化。便于在網(wǎng)絡(luò)中傳輸和保存這個(gè)標(biāo)簽是類可以被序列化的特性,表示這個(gè)類可以被序列化。10.2.1 實(shí)體層AdminInfo實(shí)體類文件:AdminInfo.csusingSystem;namespaceMessageBoard.Entity{/**////<summary>///實(shí)體類-管理員

///</summary>[Serializable]publicclassAdminInfo{privateintid;privatestringname;privatestringpassword;publicintID{get{returnthis.id;}set{this.id=value;}}publicstringName{get{return;}set{=value;}}publicstringPassword{get{returnthis.password;}set{this.password=value;}}}}10.2.2 數(shù)據(jù)訪問(wèn)層數(shù)據(jù)訪問(wèn)層也被叫做持久層,其主要功能是負(fù)責(zé)數(shù)據(jù)庫(kù)的訪問(wèn)。簡(jiǎn)單來(lái)說(shuō),就是實(shí)現(xiàn)對(duì)數(shù)據(jù)表的select、insert、update、delete的操作。數(shù)據(jù)訪問(wèn)層的第一種實(shí)現(xiàn):Access+SQL數(shù)據(jù)訪問(wèn)層的第二種實(shí)現(xiàn):SQLServer+存儲(chǔ)過(guò)程10.2.3 業(yè)務(wù)邏輯層在實(shí)際應(yīng)用中,業(yè)務(wù)邏輯層是至關(guān)重要的,它承載著整個(gè)系統(tǒng)最核心的部分,也是客戶最關(guān)注的部分。這一部分的實(shí)現(xiàn),通常需要技術(shù)專家和領(lǐng)域?qū)<彝献鳎凑諏?shí)際的業(yè)務(wù)要求進(jìn)行編寫。業(yè)務(wù)邏輯層主要承擔(dān)了以下職責(zé):對(duì)不同數(shù)據(jù)訪問(wèn)層的封裝。使得表示層可以不關(guān)心具體的數(shù)據(jù)訪問(wèn)層。業(yè)務(wù)邏輯數(shù)據(jù)的填充與轉(zhuǎn)換。如管理員口令的加密。核心業(yè)務(wù)的實(shí)現(xiàn)。10.2.3 業(yè)務(wù)邏輯層這里很多業(yè)務(wù)邏輯只有一行代碼,即一個(gè)業(yè)務(wù)邏輯方法恰好對(duì)應(yīng)一個(gè)數(shù)據(jù)訪問(wèn)方法,但是也有通過(guò)多個(gè)數(shù)據(jù)訪問(wèn)方法實(shí)現(xiàn)業(yè)務(wù)的。如AdminBLL中的ChangePassword方法就調(diào)用了AdminDAL的GetByID和Update兩個(gè)方法。另外,雖然許多方法只調(diào)用一個(gè)數(shù)據(jù)訪問(wèn)方法,但是從命名看也能看出兩者關(guān)注角度的不同。如AdminDAL中的GetByNameAndPassword,這個(gè)名字顯然是從數(shù)據(jù)庫(kù)的角度看問(wèn)題——指按照指定的Name和Password兩個(gè)字段的值取出相應(yīng)信息,至于這樣做的業(yè)務(wù)意義它不需要知道。而AdminBLL中,調(diào)用它的方法叫Login,這是從業(yè)務(wù)角度看問(wèn)題——即這個(gè)方法是管理員登錄。10.2.4 表示層表示層是一個(gè)系統(tǒng)的“門臉”,不論你的系統(tǒng)設(shè)計(jì)的多么優(yōu)秀,代碼多么漂亮,系統(tǒng)的可擴(kuò)展性多么高,但是最終用戶接觸到的大多是表示層的東西。所以,表示層的優(yōu)劣對(duì)于用戶最終對(duì)系統(tǒng)的評(píng)價(jià)至關(guān)重要。一般來(lái)說(shuō),表示層的優(yōu)劣有一下兩個(gè)評(píng)價(jià)指標(biāo):美觀:即外觀設(shè)計(jì)漂亮,能給人美的感覺(jué)。易用:即具有良好的用戶體驗(yàn),用戶用起來(lái)方便順手,用戶覺(jué)得系統(tǒng)易于使用。表示層的職責(zé)有以下兩點(diǎn):接收用戶的輸入。向用戶呈現(xiàn)信息。10.3 三層架構(gòu)改進(jìn)-依賴注入

10.3.1 接口的設(shè)計(jì)與實(shí)現(xiàn)10.3.2 依賴注入10.3.3 反射機(jī)制的使用10.3.4 緩存及緩存依賴項(xiàng)跟蹤10.3.1 接口的設(shè)計(jì)與實(shí)現(xiàn)接口(Interface)定義了所有類繼承接口時(shí)應(yīng)遵循的語(yǔ)法合同。接口定義了語(yǔ)法合同"是什么"部分,派生類定義了語(yǔ)法合同"怎么做"部分。接口定義了屬性、方法和事件,這些都是接口的成員。接口只包含了成員的聲明。成員的定義是派生類的責(zé)任。接口提供了派生類應(yīng)遵循的標(biāo)準(zhǔn)結(jié)構(gòu)。接口使得實(shí)現(xiàn)接口的類或結(jié)構(gòu)在形式上保持一致。抽象類在某種程度上與接口類似,但是,它們大多只是用在當(dāng)只有少數(shù)方法由基類聲明由派生類實(shí)現(xiàn)時(shí)。10.3.1 接口的設(shè)計(jì)與實(shí)現(xiàn)接口使用interface關(guān)鍵字聲明,它與類的聲明類似。接口聲明默認(rèn)是public的。下面是一個(gè)接口聲明的實(shí)例:InterfaceImplementer.csinterfaceIMyInterface{voidMethodToImplement();}以上代碼定義了接口IMyInterface。通常接口以I字母開(kāi)頭,這個(gè)接口只有一個(gè)方法MethodToImplement(),沒(méi)有參數(shù)和返回值,當(dāng)然我們可以按照需求設(shè)置參數(shù)和返回值。值得注意的是,該方法并沒(méi)有具體的實(shí)現(xiàn)。10.3.1 接口的設(shè)計(jì)與實(shí)現(xiàn)實(shí)現(xiàn)以上接口:classInterfaceImplementer:IMyInterface{staticvoidMain(){InterfaceImplementeriImp=newInterfaceImplementer();iImp.MethodToImplement();}publicvoidMethodToImplement(){Console.WriteLine("MethodToImplement()called.");}}10.3.1 接口的設(shè)計(jì)與實(shí)現(xiàn)實(shí)現(xiàn)以上接口:classInterfaceImplementer:IMyInterface{staticvoidMain(){InterfaceImplementeriImp=newInterfaceImplementer();iImp.MethodToImplement();}publicvoidMethodToImplement(){Console.WriteLine("MethodToImplement()called.");}}10.3.1 接口的設(shè)計(jì)與實(shí)現(xiàn)業(yè)務(wù)邏輯層的接口:IAdminBLL:Add(添加管理員),Remove(刪除管理員),ChangePassword(修改管理員密碼),Login(管理員登錄),GetAll(取得全部管理員)IMessageBLL:Add(添加留言),Remove(刪除留言),Revert(回復(fù)留言),Pass(將留言通過(guò)驗(yàn)證),GetByPage(按分頁(yè)取得留言)。ICommentBLL:Add(添加評(píng)論),Remove(刪除評(píng)論),GetByMessage(按留言取得全部評(píng)論)10.3.1 接口的設(shè)計(jì)與實(shí)現(xiàn)數(shù)據(jù)訪問(wèn)層的接口:IAdminDAL:Insert,Delete,Update,GetByID,GetByNameAndPassword,GetAllIMessageDAL:Insert,Delete,Update,GetByID,GetByPageICommentDAL:Insert,Delete,GetByMessage10.3.2 依賴注入控制反轉(zhuǎn)(InversionofControl,英文縮寫為IoC)是框架的重要特征,并非面向?qū)ο缶幊痰膶S眯g(shù)語(yǔ)。它包括依賴注入(DependencyInjection,簡(jiǎn)稱DI)和依賴查找(DependencyLookup)。我們?cè)O(shè)計(jì)的分層架構(gòu),層與層之間應(yīng)該是松散耦合的。因?yàn)槭菃蜗騿我徽{(diào)用,所以,這里的“松散耦合”實(shí)際是指上層類不能具體依賴于下層類,而應(yīng)該依賴于下層提供的一個(gè)接口。這樣,上層類不能直接實(shí)例化下層中的類,而只持有接口,至于接口所指變量最終究竟是哪一個(gè)類的對(duì)象,則由依賴注入機(jī)制決定。之所以這樣做,是為了實(shí)現(xiàn)層與層之間的“可替換”式設(shè)計(jì),例如,現(xiàn)在需要換一種方式實(shí)現(xiàn)數(shù)據(jù)訪問(wèn)層,只要這個(gè)實(shí)現(xiàn)遵循了前面定義的數(shù)據(jù)訪問(wèn)層接口,業(yè)務(wù)邏輯層和表示層不需要做任何改動(dòng),只需要改一下配置文件系統(tǒng)即可正常運(yùn)行。另外,基于這種結(jié)構(gòu)的系統(tǒng),還可以實(shí)現(xiàn)并行開(kāi)發(fā)。即不同開(kāi)發(fā)人員可以專注于自己的層次,只有接口被定義好了,開(kāi)發(fā)出來(lái)的東西就可以無(wú)縫連接。10.3.2 依賴注入依賴注入的理論基礎(chǔ)是AbstractFactory設(shè)計(jì)模式假設(shè)有針對(duì)Access和SQLServer兩種數(shù)據(jù)庫(kù)的數(shù)據(jù)訪問(wèn)層,它們都實(shí)現(xiàn)了數(shù)據(jù)訪問(wèn)層接口。每個(gè)數(shù)據(jù)訪問(wèn)層有自己的工廠,所有工廠都實(shí)現(xiàn)自IDALFactory接口。而客戶類(這里就是業(yè)務(wù)邏輯層類)僅與工廠接口、數(shù)據(jù)訪問(wèn)層接口耦合,而與具體類無(wú)關(guān),這樣,只要通過(guò)配置文件確定實(shí)例化哪個(gè)工廠,就可以得到不同的數(shù)據(jù)訪問(wèn)層。10.3.2 依賴注入這種設(shè)計(jì)雖然可行,但是代碼比較冗余,因?yàn)檫@樣需要為數(shù)據(jù)訪問(wèn)層的每一個(gè)實(shí)現(xiàn)編寫一個(gè)工廠,業(yè)務(wù)邏輯層也一樣。.NET平臺(tái)引入的反射機(jī)制,給我們提供了一種解決方案。使用反射,每個(gè)層只需要一個(gè)工廠,然后通過(guò)從配置文件中讀出程序集的名稱,動(dòng)態(tài)加載相應(yīng)類。另外,為了提高依賴注入機(jī)制的效率,這里引入緩存機(jī)制。下面來(lái)看具體實(shí)現(xiàn)。首先,需要在Web工程的Web.config文件的<appSettings>節(jié)點(diǎn)下添加如下兩個(gè)項(xiàng):<addkey="DAL"value=""/><addkey="BLL"value=""/>這兩個(gè)配置選項(xiàng)分別存儲(chǔ)要應(yīng)用的數(shù)據(jù)訪問(wèn)和業(yè)務(wù)邏輯層的程序集名稱。value目前是空,是因?yàn)槟壳斑€沒(méi)有各個(gè)層次的具體實(shí)現(xiàn)。其次,實(shí)現(xiàn)實(shí)現(xiàn)緩存操作輔助類。10.3.3 反射機(jī)制的使用什么是反射?指程序可以訪問(wèn)、檢測(cè)和修改它本身狀態(tài)或行為的一種能力。反射提供了封裝程序集、模塊和類型的對(duì)象(Type類型)??梢允褂梅瓷鋭?dòng)態(tài)創(chuàng)建類型的實(shí)例,將類型綁定到現(xiàn)有對(duì)象,或從現(xiàn)有對(duì)象獲取類型并調(diào)用其方法或訪問(wèn)其字段和屬性。如果代碼中使用了屬性,可以利用反射對(duì)它們進(jìn)行訪問(wèn)。反射機(jī)制是.Net中獲取運(yùn)行時(shí)類型信息的方式,.Net的應(yīng)用程序由幾個(gè)部分:程序集(Assembly)、模塊(Module)、類型(class)組成,而反射提供一種編程的方式,讓程序員可以在程序運(yùn)行期獲得這幾個(gè)組成部分的相關(guān)信息。10.3.4 緩存及緩存依賴項(xiàng)跟蹤1.緩存的應(yīng)用緩存應(yīng)用的目的:緩存主要是為了提高數(shù)據(jù)的讀取速度。因?yàn)榉?wù)器和應(yīng)用客戶端之間存在著流量的瓶頸,所以讀取大容量數(shù)據(jù)時(shí),使用緩存來(lái)直接為客戶端服務(wù),可以減少客戶端與服務(wù)器端的數(shù)據(jù)交互,從而大大提高程序的性能。緩存的引用空間為System.Web.Caching;緩存命名空間主要提供三種操作:緩存數(shù)據(jù)對(duì)象、對(duì)象的緩存

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論