佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > 《解剖PetShop》之一:PetShop的系統(tǒng)架構(gòu)設(shè)計(jì)

《解剖PetShop》之一:PetShop的系統(tǒng)架構(gòu)設(shè)計(jì)

熱門標(biāo)簽:呼叫中心 硅谷的囚徒呼叫中心 服務(wù)器配置 智能手機(jī) 蘋果 電子圍欄 解決方案 地方門戶網(wǎng)站

  前言:PetShop是一個(gè)范例,微軟用它來(lái)展示.Net企業(yè)系統(tǒng)開發(fā)的能力。業(yè)界有許多.Net與J2EE之爭(zhēng),許多數(shù)據(jù)是從微軟的PetShop和Sun的PetStore而來(lái)。這種爭(zhēng)論不可避免帶有濃厚的商業(yè)色彩,對(duì)于我們開發(fā)人員而言,沒(méi)有必要過(guò)多關(guān)注。然而PetShop隨著版本的不斷更新,至現(xiàn)在基于.Net 2.0的PetShop4.0為止,整個(gè)設(shè)計(jì)逐漸變得成熟而優(yōu)雅,卻又很多可以借鑒之處。PetShop是一個(gè)小型的項(xiàng)目,系統(tǒng)架構(gòu)與代碼都比較簡(jiǎn)單,卻也凸現(xiàn)了許多頗有價(jià)值的設(shè)計(jì)與開發(fā)理念。本系列試圖對(duì)PetShop作一個(gè)全方位的解剖,依據(jù)的代碼是PetShop4.0,可以從鏈接http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/bdasamppet4.asp中獲得。

一、PetShop的系統(tǒng)架構(gòu)設(shè)計(jì)

  在軟件體系架構(gòu)設(shè)計(jì)中,分層式結(jié)構(gòu)是最常見,也是最重要的一種結(jié)構(gòu)。微軟推薦的分層式結(jié)構(gòu)一般分為三層,從下至上分別為:數(shù)據(jù)訪問(wèn)層、業(yè)務(wù)邏輯層(又或成為領(lǐng)域?qū)樱⒈硎緦?,如圖所示:


圖一:三層的分層式結(jié)構(gòu)

  數(shù)據(jù)訪問(wèn)層:有時(shí)候也稱為是持久層,其功能主要是負(fù)責(zé)數(shù)據(jù)庫(kù)的訪問(wèn)。簡(jiǎn)單的說(shuō)法就是實(shí)現(xiàn)對(duì)數(shù)據(jù)表的Select,Insert,Update,Delete的操作。如果要加入ORM的元素,那么就會(huì)包括對(duì)象和數(shù)據(jù)表之間的mapping,以及對(duì)象實(shí)體的持久化。在PetShop的數(shù)據(jù)訪問(wèn)層中,并沒(méi)有使用ORM,從而導(dǎo)致了代碼量的增加,可以看作是整個(gè)設(shè)計(jì)實(shí)現(xiàn)中的一大敗筆。

  業(yè)務(wù)邏輯層:是整個(gè)系統(tǒng)的核心,它與這個(gè)系統(tǒng)的業(yè)務(wù)(領(lǐng)域)有關(guān)。以PetShop為例,業(yè)務(wù)邏輯層的相關(guān)設(shè)計(jì),均和網(wǎng)上寵物店特有的邏輯相關(guān),例如查詢寵物,下訂單,添加寵物到購(gòu)物車等等。如果涉及到數(shù)據(jù)庫(kù)的訪問(wèn),則調(diào)用數(shù)據(jù)訪問(wèn)層。

  表示層:是系統(tǒng)的UI部分,負(fù)責(zé)使用者與整個(gè)系統(tǒng)的交互。在這一層中,理想的狀態(tài)是不應(yīng)包括系統(tǒng)的業(yè)務(wù)邏輯。表示層中的邏輯代碼,僅與界面元素有關(guān)。在PetShop中,是利用ASP.Net來(lái)設(shè)計(jì)的,因此包含了許多Web控件和相關(guān)邏輯。

分層式結(jié)構(gòu)究竟其優(yōu)勢(shì)何在?Martin Fowler在《Patterns of Enterprise Application Architecture》一書中給出了答案:

1、開發(fā)人員可以只關(guān)注整個(gè)結(jié)構(gòu)中的其中某一層;
2、可以很容易的用新的實(shí)現(xiàn)來(lái)替換原有層次的實(shí)現(xiàn);
3、可以降低層與層之間的依賴;
4、有利于標(biāo)準(zhǔn)化;
5、利于各層邏輯的復(fù)用。

  概括來(lái)說(shuō),分層式設(shè)計(jì)可以達(dá)至如下目的:分散關(guān)注、松散耦合、邏輯復(fù)用、標(biāo)準(zhǔn)定義。

  一個(gè)好的分層式結(jié)構(gòu),可以使得開發(fā)人員的分工更加明確。一旦定義好各層次之間的接口,負(fù)責(zé)不同邏輯設(shè)計(jì)的開發(fā)人員就可以分散關(guān)注,齊頭并進(jìn)。例如UI人員只需考慮用戶界面的體驗(yàn)與操作,領(lǐng)域的設(shè)計(jì)人員可以僅關(guān)注業(yè)務(wù)邏輯的設(shè)計(jì),而數(shù)據(jù)庫(kù)設(shè)計(jì)人員也不必為繁瑣的用戶交互而頭疼了。每個(gè)開發(fā)人員的任務(wù)得到了確認(rèn),開發(fā)進(jìn)度就可以迅速的提高。

  松散耦合的好處是顯而易見的。如果一個(gè)系統(tǒng)沒(méi)有分層,那么各自的邏輯都緊緊糾纏在一起,彼此間相互依賴,誰(shuí)都是不可替換的。一旦發(fā)生改變,則牽一發(fā)而動(dòng)全身,對(duì)項(xiàng)目的影響極為嚴(yán)重。降低層與層間的依賴性,既可以良好地保證未來(lái)的可擴(kuò)展,在復(fù)用性上也是優(yōu)勢(shì)明顯。每個(gè)功能模塊一旦定義好統(tǒng)一的接口,就可以被各個(gè)模塊所調(diào)用,而不用為相同的功能進(jìn)行重復(fù)地開發(fā)。

  進(jìn)行好的分層式結(jié)構(gòu)設(shè)計(jì),標(biāo)準(zhǔn)也是必不可少的。只有在一定程度的標(biāo)準(zhǔn)化基礎(chǔ)上,這個(gè)系統(tǒng)才是可擴(kuò)展的,可替換的。而層與層之間的通信也必然保證了接口的標(biāo)準(zhǔn)化。

“金無(wú)足赤,人無(wú)完人”,分層式結(jié)構(gòu)也不可避免具有一些缺陷:

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)的代碼。

前面提到,PetShop的表示層是用ASP.Net設(shè)計(jì)的,也就是說(shuō),它應(yīng)是一個(gè)BS系統(tǒng)。在.Net中,標(biāo)準(zhǔn)的BS分層式結(jié)構(gòu)如下圖所示:


圖二:.Net中標(biāo)準(zhǔn)的BS分層式結(jié)構(gòu)

隨著PetShop版本的更新,其分層式結(jié)構(gòu)也在不斷的完善,例如PetShop2.0,就沒(méi)有采用標(biāo)準(zhǔn)的三層式結(jié)構(gòu),如圖三:


圖三:PetShop 2.0的體系架構(gòu)

  從圖中我們可以看到,并沒(méi)有明顯的數(shù)據(jù)訪問(wèn)層設(shè)計(jì)。這樣的設(shè)計(jì)雖然提高了數(shù)據(jù)訪問(wèn)的性能,但也同時(shí)導(dǎo)致了業(yè)務(wù)邏輯層與數(shù)據(jù)訪問(wèn)的職責(zé)混亂。一旦要求支持的數(shù)據(jù)庫(kù)發(fā)生變化,或者需要修改數(shù)據(jù)訪問(wèn)的邏輯,由于沒(méi)有清晰的分層,會(huì)導(dǎo)致項(xiàng)目作大的修改。而隨著硬件系統(tǒng)性能的提高,以及充分利用緩存、異步處理等機(jī)制,分層式結(jié)構(gòu)所帶來(lái)的性能影響幾乎可以忽略不計(jì)。

PetShop3.0糾正了此前層次不明的問(wèn)題,將數(shù)據(jù)訪問(wèn)邏輯作為單獨(dú)的一層獨(dú)立出來(lái):


圖四:PetShop 3.0的體系架構(gòu)

  PetShop4.0基本上延續(xù)了3.0的結(jié)構(gòu),但在性能上作了一定的改進(jìn),引入了緩存和異步處理機(jī)制,同時(shí)又充分利用了ASP.Net 2.0的新功能MemberShip,因此PetShop4.0的系統(tǒng)架構(gòu)圖如下所示:


圖五:PetShop 4.0的體系架構(gòu)

  比較3.0和4.0的系統(tǒng)架構(gòu)圖,其核心的內(nèi)容并沒(méi)有發(fā)生變化。在數(shù)據(jù)訪問(wèn)層(DAL)中,仍然采用DAL Interface抽象出數(shù)據(jù)訪問(wèn)邏輯,并以DAL Factory作為數(shù)據(jù)訪問(wèn)層對(duì)象的工廠模塊。對(duì)于DAL Interface而言,分別有支持MS-SQL的SQL Server DAL和支持Oracle的Oracle DAL具體實(shí)現(xiàn)。而Model模塊則包含了數(shù)據(jù)實(shí)體對(duì)象。其詳細(xì)的模塊結(jié)構(gòu)圖如下所示:


圖六:數(shù)據(jù)訪問(wèn)層的模塊結(jié)構(gòu)圖

  可以看到,在數(shù)據(jù)訪問(wèn)層中,完全采用了“面向接口編程”思想。抽象出來(lái)的IDAL模塊,脫離了與具體數(shù)據(jù)庫(kù)的依賴,從而使得整個(gè)數(shù)據(jù)訪問(wèn)層利于數(shù)據(jù)庫(kù)遷移。DALFactory模塊專門管理DAL對(duì)象的創(chuàng)建,便于業(yè)務(wù)邏輯層訪問(wèn)。SQLServerDAL和OracleDAL模塊均實(shí)現(xiàn)IDAL模塊的接口,其中包含的邏輯就是對(duì)數(shù)據(jù)庫(kù)的Select,Insert,Update和Delete操作。因?yàn)閿?shù)據(jù)庫(kù)類型的不同,對(duì)數(shù)據(jù)庫(kù)的操作也有所不同,代碼也會(huì)因此有所區(qū)別。

  此外,抽象出來(lái)的IDAL模塊,除了解除了向下的依賴之外,對(duì)于其上的業(yè)務(wù)邏輯層,同樣僅存在弱依賴關(guān)系,如下圖所示:


圖七:業(yè)務(wù)邏輯層的模塊結(jié)構(gòu)圖

  圖七中BLL是業(yè)務(wù)邏輯層的核心模塊,它包含了整個(gè)系統(tǒng)的核心業(yè)務(wù)。在業(yè)務(wù)邏輯層中,不能直接訪問(wèn)數(shù)據(jù)庫(kù),而必須通過(guò)數(shù)據(jù)訪問(wèn)層。注意圖中對(duì)數(shù)據(jù)訪問(wèn)業(yè)務(wù)的調(diào)用,是通過(guò)接口模塊IDAL來(lái)完成的。既然與具體的數(shù)據(jù)訪問(wèn)邏輯無(wú)關(guān),則層與層之間的關(guān)系就是松散耦合的。如果此時(shí)需要修改數(shù)據(jù)訪問(wèn)層的具體實(shí)現(xiàn),只要不涉及到IDAL的接口定義,那么業(yè)務(wù)邏輯層就不會(huì)受到任何影響。畢竟,具體實(shí)現(xiàn)的SQLServerDAL和OracalDAL根本就與業(yè)務(wù)邏輯層沒(méi)有半點(diǎn)關(guān)系。

  因?yàn)樵赑etShop 4.0中引入了異步處理機(jī)制。插入訂單的策略可以分為同步和異步,兩者的插入策略明顯不同,但對(duì)于調(diào)用者而言,插入訂單的接口是完全一樣的,所以PetShop 4.0中設(shè)計(jì)了IBLLStrategy模塊。雖然在IBLLStrategy模塊中,僅僅是簡(jiǎn)單的IOrderStategy,但同時(shí)也給出了一個(gè)范例和信息,那就是在業(yè)務(wù)邏輯的處理中,如果存在業(yè)務(wù)操作的多樣化,或者是今后可能的變化,均應(yīng)利用抽象的原理。或者使用接口,或者使用抽象類,從而脫離對(duì)具體業(yè)務(wù)的依賴。不過(guò)在PetShop中,由于業(yè)務(wù)邏輯相對(duì)簡(jiǎn)單,這種思想體現(xiàn)得不夠明顯。也正因?yàn)榇?,PetShop將核心的業(yè)務(wù)邏輯都放到了一個(gè)模塊BLL中,并沒(méi)有將具體的實(shí)現(xiàn)和抽象嚴(yán)格的按照模塊分開。所以表示層和業(yè)務(wù)邏輯層之間的調(diào)用關(guān)系,其耦合度相對(duì)較高:


圖八:表示層的模塊結(jié)構(gòu)圖

  在圖五中,各個(gè)層次中還引入了輔助的模塊,如數(shù)據(jù)訪問(wèn)層的Messaging模塊,是為異步插入訂單的功能提供,采用了MSMQ(Microsoft Messaging Queue)技術(shù)。而表示層的CacheDependency則提供緩存功能。這些特殊的模塊,我會(huì)在此后的文章中詳細(xì)介紹。

  以上就是PetShop系統(tǒng)架構(gòu)的全部?jī)?nèi)容,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • 學(xué)會(huì)sql數(shù)據(jù)庫(kù)關(guān)系圖(Petshop)
  • 《解剖PetShop》之二:PetShop數(shù)據(jù)訪問(wèn)層數(shù)之據(jù)庫(kù)訪問(wèn)設(shè)計(jì)
  • 《解剖PetShop》之三:PetShop數(shù)據(jù)訪問(wèn)層之消息處理
  • 《解剖PetShop》之四:PetShop之ASP.NET緩存
  • 《解剖PetShop》之五:PetShop之業(yè)務(wù)邏輯層設(shè)計(jì)
  • 《解剖PetShop》之六:PetShop之表示層設(shè)計(jì)

標(biāo)簽:德宏 喀什 玉林 呂梁 房產(chǎn) 泰安 佳木斯

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《《解剖PetShop》之一:PetShop的系統(tǒng)架構(gòu)設(shè)計(jì)》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    襄垣县| 同仁县| 武冈市| 清原| 友谊县| 海口市| 阳东县| 历史| 海晏县| 宾川县| 原阳县| 湖口县| 泽库县| 东阿县| 闻喜县| 咸宁市| 称多县| 庄河市| 旬阳县| 娄烦县| 扎鲁特旗| 昌邑市| 原阳县| 南澳县| 方城县| 峨眉山市| 吴川市| 涟水县| 马鞍山市| 金山区| 辽阳县| 富川| 漳浦县| 江达县| 仙居县| 奉化市| 尖扎县| 阜南县| 华安县| 屏山县| 兴海县|