|
前幾天我在我的Blog上發(fā)布了NGuestBook(點擊這里下載),得到了很多反饋,在這里非常感謝大家的關(guān)注和支持。一些朋友在E-mail中提到,這個NGuestBook和我那個系列文章《基于.NET平臺的分層架構(gòu)實戰(zhàn)》中講的Demo有非常多不一樣的地方,問我能不能單獨寫一篇文章說明一下這個新NGuestBook的架構(gòu)方式和實現(xiàn)相關(guān)的問題。
所以我專門寫下這篇文章,對這個NGuestBook的架構(gòu)體系和實現(xiàn)進(jìn)行一個簡要的說明,希望本文的內(nèi)容能對大家有所幫助。
有兩點要特別說明:一是下面的內(nèi)容中非正式的使用了UML包圖,這里用UML只是為了描述一種架構(gòu),而不是建模,所以可能有很多不符合UML標(biāo)準(zhǔn)的地方,還請海涵了,只要您能看懂大體的結(jié)構(gòu)表示就好。二是一下的描述,特別是圖示,是以抽象架構(gòu)工件為基本元素的,可能不會和源碼中的工程、文件、類嚴(yán)格對應(yīng),但是,應(yīng)該能很容易分辨出抽象工件元素和具體工程、文件等元素的對應(yīng)關(guān)系。
總體架構(gòu)
我們先來看NGuestBook的總體架構(gòu)圖,如圖1所示。
圖1
整體采用分層架構(gòu),這個思想很明顯。從上到下依次為表示層(Web)、業(yè)務(wù)邏輯層(BusinessComponents)和數(shù)據(jù)訪問層(DataComponents)。
其中表示層直接依賴業(yè)務(wù)邏輯層,而業(yè)務(wù)邏輯層通過數(shù)據(jù)訪問層接口依賴數(shù)據(jù)訪問層。在業(yè)務(wù)邏輯層和數(shù)據(jù)訪問層接口上,存在依賴注入組件(Factories),便于進(jìn)行不同數(shù)據(jù)訪問層的替換。
這里預(yù)設(shè)了三個數(shù)據(jù)訪問層,LinqDataComponents是使用linq to sql技術(shù)為ORM組件實現(xiàn)的數(shù)據(jù)訪問層,SQLDataComponents使用傳統(tǒng)的SQL語句訪問數(shù)據(jù)庫,這兩個數(shù)據(jù)訪問層都是以關(guān)系數(shù)據(jù)庫作為數(shù)據(jù)源;XMLDataComponents是以XML文件為數(shù)據(jù)源的數(shù)據(jù)訪問層,他們都是DataComponentInterfaces的實現(xiàn)。(特別說明:在提供的源代碼中,只實現(xiàn)了LinqDataComponents,其他兩個數(shù)據(jù)訪問層只給出了擴(kuò)展接口,沒有具體實現(xiàn)。)
Entities作為實體類組件,存放系統(tǒng)中用到的“貧血實體類”,這些實體類只用于存放數(shù)據(jù),并負(fù)責(zé)在各層間數(shù)據(jù)的傳遞,是各層數(shù)據(jù)存取傳遞的媒介和標(biāo)準(zhǔn)。
Utilities作為工具庫組件,存放各種可復(fù)用的工具類。
下面,對各個組件分別進(jìn)行說明。
實體類組件
實體類組件是現(xiàn)實世界業(yè)務(wù)實體在計算機(jī)世界中的表示,負(fù)責(zé)在各層之間的數(shù)據(jù)的傳遞,并維護(hù)數(shù)據(jù)格式標(biāo)準(zhǔn)。說通俗一點,就是各個層都“認(rèn)識”這組標(biāo)準(zhǔn)實體類,傳入、傳出數(shù)據(jù)都以這種格式進(jìn)行。
為什么要這樣呢?因為我們整體思想是盡可能保持各層間的耦合度較低,并相對獨立,但是系統(tǒng)要工作,各層間就不可避免交換數(shù)據(jù),因此,我們需要一種標(biāo)準(zhǔn)的、簡單的、與各層無關(guān)的數(shù)據(jù)格式,否則如果強(qiáng)制某層強(qiáng)制其它層“認(rèn)識”它特有的數(shù)據(jù)格式,就可能造成污染。
例如,如果我們以DataTable為數(shù)據(jù)交換格式,那么業(yè)務(wù)邏輯層和表示層都得認(rèn)識這種數(shù)據(jù)格式才行,如果有一天,我們要換數(shù)據(jù)訪問層,不需要DataTable了,那么業(yè)務(wù)邏輯層和表示層都要修改。所以,我們要使用這種標(biāo)準(zhǔn)的、與特定層無關(guān)的數(shù)據(jù)格式作為交換格式,而如果某層有特定的數(shù)據(jù)格式,要在內(nèi)部實現(xiàn)轉(zhuǎn)換,對外傳遞的必須是這種標(biāo)準(zhǔn)格式。
這里的實體類采用貧血實體類,而且由于業(yè)務(wù)很簡單,整個系統(tǒng)只有一個實體類:MessageInfo。
圖2
工具類組件
工具類組件里是一些可復(fù)用的工具性類,這里主要包括三個:
CacheAccessor:用于緩存的存取操作。
SessionAccessor:用于Session的存取操作。
ValidateHelper:用于數(shù)據(jù)驗證的相關(guān)操作,主要用在表示層里。
圖3
數(shù)據(jù)訪問層接口
數(shù)據(jù)訪問層接口規(guī)定了數(shù)據(jù)訪問層應(yīng)該實現(xiàn)的方法,并作為業(yè)務(wù)邏輯層的依賴接口。
由于整體只有一個實體——Message需要數(shù)據(jù)持久化,所以數(shù)據(jù)訪問層接口只有一個接口文件。
圖4
基于linq to sql的數(shù)據(jù)訪問層
NGuestBook實現(xiàn)的數(shù)據(jù)訪問層是基于linq to sql的。總體來說,開發(fā)小型項目時,linq to sql是不錯的ORM解決方案。數(shù)據(jù)訪問層的內(nèi)部架構(gòu)如圖5所示。
圖5
其中DataClasses是linq to sql框架根據(jù)數(shù)據(jù)庫自動生成的特有實體類,用于linq to sql的操作。而數(shù)據(jù)訪問主部件MessageDataComponent僅僅依賴DataClasses,這是因為MessageDataComponent的linq to sql操作必須使用這種特殊的實體類。
而對外交流時,又需要使用公共實體類MessageInfo,所以,我們需要一個EntityConvertor,作為兩種實體類之間的轉(zhuǎn)換器,這個轉(zhuǎn)換器是這個Linq to sql數(shù)據(jù)訪問層的內(nèi)部機(jī)制,對外部一律透明。
這里要注意,EntityConvertor是一個概念上的工件,實際實現(xiàn)時其功能集成于MessageDataComponent。
業(yè)務(wù)邏輯層
業(yè)務(wù)邏輯層實現(xiàn)主要業(yè)務(wù)。
業(yè)務(wù)邏輯層有兩個工件:AdminBusinessComponent和MessageBusinessComponent。其中后一個主要實現(xiàn)各種留言的業(yè)務(wù)操作,而前一個是管理員的業(yè)務(wù)操作。由于管理員的信息是記錄在配置文件中而非持久化在數(shù)據(jù)庫中,所以這個業(yè)務(wù)工件并不需要數(shù)據(jù)訪問層的支持。
這里特別提醒,朋友們可以仔細(xì)看一下業(yè)務(wù)邏輯層的方法命名和代碼,就會明白,即使在如此微小的系統(tǒng)中,業(yè)務(wù)邏輯層也不是對數(shù)據(jù)訪問層簡單的封裝調(diào)用,業(yè)務(wù)邏輯和數(shù)據(jù)訪問是完全兩個不同的概念。
圖6
依賴注入組件
依賴注入實現(xiàn)了依賴配置動態(tài)選擇數(shù)據(jù)訪問層并注入業(yè)務(wù)邏輯層中,實現(xiàn)兩層之間的解耦,具體實現(xiàn)的基礎(chǔ)是Abstract Factory模式,并配合了反射機(jī)制和緩存機(jī)制。
圖7
如圖7所示,依賴注入組件的主要工件是DataComponentFactory,它是一個反射工廠,它可以通過反射機(jī)制加載某個指定的數(shù)據(jù)訪問層,而后將其注入到業(yè)務(wù)邏輯層中。至于具體加載哪一個,則依賴Web.config中的配置。
兩外,它還依賴CacheAccessor實現(xiàn)緩存機(jī)制,對加載過的數(shù)據(jù)訪問組件進(jìn)行緩存,提高系統(tǒng)運行效率。
表示層
NGuestBook的表示層使用了Microsoft ASP.NET MVC框架,版本是Releasse Candidate,所以,整個表示層的架構(gòu)符合MVC模式。
圖8
由于ASP.NET MVC的架構(gòu)原理非常復(fù)雜,這里就不將具體細(xì)節(jié)全部表述。大體架構(gòu)如圖8所示,Controllers控制器組件是整個MVC的核心,負(fù)責(zé)整體的調(diào)控。而Views視圖組件則使用ASPx頁面實現(xiàn),F(xiàn)ilters是一些攔截器類,主要實現(xiàn)了身份驗證和異常處理的功能。而Controllers直接依賴BusinessComponent完成業(yè)務(wù)功能,所以BusinessComponent實際上可以看成是MVC的Model。
實際上,表示層還依賴工具類組件完成Session存取和數(shù)據(jù)驗證的工作。
總結(jié)
以上就是NGuestBook架構(gòu)的一個簡單說明,限于篇幅,不能完全顧及到每一個細(xì)節(jié),還請見諒。希望以上內(nèi)容對大家有所幫助。
NET技術(shù):NGuestBook架構(gòu)體系及實現(xiàn)指南,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。