色尼玛亚洲综合影院,亚洲3atv精品一区二区三区,麻豆freexxxx性91精品,欧美在线91

NGuestBook架構(gòu)體系及實(shí)現(xiàn)指南

      前幾天我在我的Blog上發(fā)布了NGuestBook(點(diǎn)擊這里下載),得到了很多反饋,在這里非常感謝大家的關(guān)注和支持。一些朋友在E-mail中提到,這個(gè)NGuestBook和我那個(gè)系列文章《基于.NET平臺(tái)的分層架構(gòu)實(shí)戰(zhàn)》中講的Demo有非常多不一樣的地方,問(wèn)我能不能單獨(dú)寫一篇文章說(shuō)明一下這個(gè)新NGuestBook的架構(gòu)方式和實(shí)現(xiàn)相關(guān)的問(wèn)題。
      所以我專門寫下這篇文章,對(duì)這個(gè)NGuestBook的架構(gòu)體系和實(shí)現(xiàn)進(jìn)行一個(gè)簡(jiǎn)要的說(shuō)明,希望本文的內(nèi)容能對(duì)大家有所幫助。
      有兩點(diǎn)要特別說(shuō)明:一是下面的內(nèi)容中非正式的使用了UML包圖,這里用UML只是為了描述一種架構(gòu),而不是建模,所以可能有很多不符合UML標(biāo)準(zhǔn)的地方,還請(qǐng)海涵了,只要您能看懂大體的結(jié)構(gòu)表示就好。二是一下的描述,特別是圖示,是以抽象架構(gòu)工件為基本元素的,可能不會(huì)和源碼中的工程、文件、類嚴(yán)格對(duì)應(yīng),但是,應(yīng)該能很容易分辨出抽象工件元素和具體工程、文件等元素的對(duì)應(yīng)關(guān)系。

  總體架構(gòu)
      我們先來(lái)看NGuestBook的總體架構(gòu)圖,如圖1所示。


圖1

      整體采用分層架構(gòu),這個(gè)思想很明顯。從上到下依次為表示層(Web)、業(yè)務(wù)邏輯層(BusinessComponents)和數(shù)據(jù)訪問(wèn)層(DataComponents)。
      其中表示層直接依賴業(yè)務(wù)邏輯層,而業(yè)務(wù)邏輯層通過(guò)數(shù)據(jù)訪問(wèn)層接口依賴數(shù)據(jù)訪問(wèn)層。在業(yè)務(wù)邏輯層和數(shù)據(jù)訪問(wèn)層接口上,存在依賴注入組件(Factories),便于進(jìn)行不同數(shù)據(jù)訪問(wèn)層的替換。
      這里預(yù)設(shè)了三個(gè)數(shù)據(jù)訪問(wèn)層,LinqDataComponents是使用linq to sql技術(shù)為ORM組件實(shí)現(xiàn)的數(shù)據(jù)訪問(wèn)層,SQLDataComponents使用傳統(tǒng)的SQL語(yǔ)句訪問(wèn)數(shù)據(jù)庫(kù),這兩個(gè)數(shù)據(jù)訪問(wèn)層都是以關(guān)系數(shù)據(jù)庫(kù)作為數(shù)據(jù)源;XMLDataComponents是以XML文件為數(shù)據(jù)源的數(shù)據(jù)訪問(wèn)層,他們都是DataComponentInterfaces的實(shí)現(xiàn)。(特別說(shuō)明:在提供的源代碼中,只實(shí)現(xiàn)了LinqDataComponents,其他兩個(gè)數(shù)據(jù)訪問(wèn)層只給出了擴(kuò)展接口,沒(méi)有具體實(shí)現(xiàn)。)
      Entities作為實(shí)體類組件,存放系統(tǒng)中用到的“貧血實(shí)體類”,這些實(shí)體類只用于存放數(shù)據(jù),并負(fù)責(zé)在各層間數(shù)據(jù)的傳遞,是各層數(shù)據(jù)存取傳遞的媒介和標(biāo)準(zhǔn)。
      Utilities作為工具庫(kù)組件,存放各種可復(fù)用的工具類。
      下面,對(duì)各個(gè)組件分別進(jìn)行說(shuō)明。

  實(shí)體類組件
      實(shí)體類組件是現(xiàn)實(shí)世界業(yè)務(wù)實(shí)體在計(jì)算機(jī)世界中的表示,負(fù)責(zé)在各層之間的數(shù)據(jù)的傳遞,并維護(hù)數(shù)據(jù)格式標(biāo)準(zhǔn)。說(shuō)通俗一點(diǎn),就是各個(gè)層都“認(rèn)識(shí)”這組標(biāo)準(zhǔn)實(shí)體類,傳入、傳出數(shù)據(jù)都以這種格式進(jìn)行。
      為什么要這樣呢?因?yàn)槲覀冋w思想是盡可能保持各層間的耦合度較低,并相對(duì)獨(dú)立,但是系統(tǒng)要工作,各層間就不可避免交換數(shù)據(jù),因此,我們需要一種標(biāo)準(zhǔn)的、簡(jiǎn)單的、與各層無(wú)關(guān)的數(shù)據(jù)格式,否則如果強(qiáng)制某層強(qiáng)制其它層“認(rèn)識(shí)”它特有的數(shù)據(jù)格式,就可能造成污染。
      例如,如果我們以DataTable為數(shù)據(jù)交換格式,那么業(yè)務(wù)邏輯層和表示層都得認(rèn)識(shí)這種數(shù)據(jù)格式才行,如果有一天,我們要換數(shù)據(jù)訪問(wèn)層,不需要DataTable了,那么業(yè)務(wù)邏輯層和表示層都要修改。所以,我們要使用這種標(biāo)準(zhǔn)的、與特定層無(wú)關(guān)的數(shù)據(jù)格式作為交換格式,而如果某層有特定的數(shù)據(jù)格式,要在內(nèi)部實(shí)現(xiàn)轉(zhuǎn)換,對(duì)外傳遞的必須是這種標(biāo)準(zhǔn)格式。
      這里的實(shí)體類采用貧血實(shí)體類,而且由于業(yè)務(wù)很簡(jiǎn)單,整個(gè)系統(tǒng)只有一個(gè)實(shí)體類:MessageInfo。


圖2

  工具類組件
      工具類組件里是一些可復(fù)用的工具性類,這里主要包括三個(gè):
      CacheAccessor:用于緩存的存取操作。
      SessionAccessor:用于Session的存取操作。
      ValidateHelper:用于數(shù)據(jù)驗(yàn)證的相關(guān)操作,主要用在表示層里。


圖3

  數(shù)據(jù)訪問(wèn)層接口
      數(shù)據(jù)訪問(wèn)層接口規(guī)定了數(shù)據(jù)訪問(wèn)層應(yīng)該實(shí)現(xiàn)的方法,并作為業(yè)務(wù)邏輯層的依賴接口。
      由于整體只有一個(gè)實(shí)體——Message需要數(shù)據(jù)持久化,所以數(shù)據(jù)訪問(wèn)層接口只有一個(gè)接口文件。


圖4

  基于linq to sql的數(shù)據(jù)訪問(wèn)層
      NGuestBook實(shí)現(xiàn)的數(shù)據(jù)訪問(wèn)層是基于linq to sql的。總體來(lái)說(shuō),開(kāi)發(fā)小型項(xiàng)目時(shí),linq to sql是不錯(cuò)的ORM解決方案。數(shù)據(jù)訪問(wèn)層的內(nèi)部架構(gòu)如圖5所示。


圖5

      其中DataClasses是linq to sql框架根據(jù)數(shù)據(jù)庫(kù)自動(dòng)生成的特有實(shí)體類,用于linq to sql的操作。而數(shù)據(jù)訪問(wèn)主部件MessageDataComponent僅僅依賴DataClasses,這是因?yàn)镸essageDataComponent的linq to sql操作必須使用這種特殊的實(shí)體類。
      而對(duì)外交流時(shí),又需要使用公共實(shí)體類MessageInfo,所以,我們需要一個(gè)EntityConvertor,作為兩種實(shí)體類之間的轉(zhuǎn)換器,這個(gè)轉(zhuǎn)換器是這個(gè)Linq to sql數(shù)據(jù)訪問(wèn)層的內(nèi)部機(jī)制,對(duì)外部一律透明。
      這里要注意,EntityConvertor是一個(gè)概念上的工件,實(shí)際實(shí)現(xiàn)時(shí)其功能集成于MessageDataComponent。

  業(yè)務(wù)邏輯層
  業(yè)務(wù)邏輯層實(shí)現(xiàn)主要業(yè)務(wù)。

  業(yè)務(wù)邏輯層有兩個(gè)工件:AdminBusinessComponent和MessageBusinessComponent。其中后一個(gè)主要實(shí)現(xiàn)各種留言的業(yè)務(wù)操作,而前一個(gè)是管理員的業(yè)務(wù)操作。由于管理員的信息是記錄在配置文件中而非持久化在數(shù)據(jù)庫(kù)中,所以這個(gè)業(yè)務(wù)工件并不需要數(shù)據(jù)訪問(wèn)層的支持。
      這里特別提醒,朋友們可以仔細(xì)看一下業(yè)務(wù)邏輯層的方法命名和代碼,就會(huì)明白,即使在如此微小的系統(tǒng)中,業(yè)務(wù)邏輯層也不是對(duì)數(shù)據(jù)訪問(wèn)層簡(jiǎn)單的封裝調(diào)用,業(yè)務(wù)邏輯和數(shù)據(jù)訪問(wèn)是完全兩個(gè)不同的概念。


圖6

  依賴注入組件
      依賴注入實(shí)現(xiàn)了依賴配置動(dòng)態(tài)選擇數(shù)據(jù)訪問(wèn)層并注入業(yè)務(wù)邏輯層中,實(shí)現(xiàn)兩層之間的解耦,具體實(shí)現(xiàn)的基礎(chǔ)是Abstract Factory模式,并配合了反射機(jī)制和緩存機(jī)制。


圖7

      如圖7所示,依賴注入組件的主要工件是DataComponentFactory,它是一個(gè)反射工廠,它可以通過(guò)反射機(jī)制加載某個(gè)指定的數(shù)據(jù)訪問(wèn)層,而后將其注入到業(yè)務(wù)邏輯層中。至于具體加載哪一個(gè),則依賴Web.config中的配置。
      兩外,它還依賴CacheAccessor實(shí)現(xiàn)緩存機(jī)制,對(duì)加載過(guò)的數(shù)據(jù)訪問(wèn)組件進(jìn)行緩存,提高系統(tǒng)運(yùn)行效率。

  表示層
     NGuestBook的表示層使用了Microsoft ASP.NET MVC框架,版本是Releasse Candidate,所以,整個(gè)表示層的架構(gòu)符合MVC模式。


圖8

      由于ASP.NET MVC的架構(gòu)原理非常復(fù)雜,這里就不將具體細(xì)節(jié)全部表述。大體架構(gòu)如圖8所示,Controllers控制器組件是整個(gè)MVC的核心,負(fù)責(zé)整體的調(diào)控。而Views視圖組件則使用ASPx頁(yè)面實(shí)現(xiàn),F(xiàn)ilters是一些攔截器類,主要實(shí)現(xiàn)了身份驗(yàn)證和異常處理的功能。而Controllers直接依賴BusinessComponent完成業(yè)務(wù)功能,所以BusinessComponent實(shí)際上可以看成是MVC的Model。
      實(shí)際上,表示層還依賴工具類組件完成Session存取和數(shù)據(jù)驗(yàn)證的工作。

  總結(jié)
      以上就是NGuestBook架構(gòu)的一個(gè)簡(jiǎn)單說(shuō)明,限于篇幅,不能完全顧及到每一個(gè)細(xì)節(jié),還請(qǐng)見(jiàn)諒。希望以上內(nèi)容對(duì)大家有所幫助。

NET技術(shù)NGuestBook架構(gòu)體系及實(shí)現(xiàn)指南,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 岑巩县| 神木县| 简阳市| 车致| 宾川县| 福贡县| 大方县| 通辽市| 青河县| 老河口市| 宁陵县| 金堂县| 新蔡县| 舒兰市| 宁强县| 固阳县| 衡南县| 武宣县| 拜城县| 叶城县| 贡山| 汾西县| 静乐县| 本溪市| 湖南省| 邵东县| 阿拉善右旗| 新泰市| 凤城市| 保亭| 黔江区| 五原县| 开平市| 五大连池市| 昌平区| 屯留县| 台江县| 长丰县| 莱西市| 深圳市| 元朗区|