《解剖PetShop》系列html
1、PetShop的系統架構設計數據庫
http://www.cnblogs.com/wayfarer/archive/2007/03/23/375382.html編程
2、PetShop數據訪問層之數據庫訪問設計緩存
http://www.cnblogs.com/wayfarer/archive/2006/04/21/381315.html架構
3、PetShop數據訪問層之消息處理app
http://www.cnblogs.com/wayfarer/archive/2007/03/15/496207.html異步
4、PetShop之ASP.NET緩存數據庫設計
http://www.cnblogs.com/wayfarer/archive/2006/11/01/547060.html性能
5、PetShop之業務邏輯層設計url
http://www.cnblogs.com/wayfarer/archive/2006/11/05/550723.html
6、PetShop之表示層設計
http://www.cnblogs.com/wayfarer/archive/2006/11/11/557933.html
《解剖PetShop》系列之一
前言:PetShop是一個範例,微軟用它來展現.Net企業系統開發的能力。業界有許多.Net與J2EE之爭,許多數據是從微軟的PetShop和Sun的PetStore而來。這種爭論不可避免帶有濃厚的商業色彩,對於咱們開發人員而言,沒有必要過多關注。然而PetShop隨着版本的不斷更新,至如今基於.Net 2.0的PetShop4.0爲止,整個設計逐漸變得成熟而優雅,卻又不少能夠借鑑之處。PetShop是一個小型的項目,系統架構與代碼都比較簡單,卻也凸現了許多很有價值的設計與開發理念。本系列試圖對PetShop做一個全方位的解剖,依據的代碼是PetShop4.0,能夠從連接http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/bdasamppet4.asp中得到。
1、PetShop的系統架構設計
在軟件體系架構設計中,分層式結構是最多見,也是最重要的一種結構。微軟推薦的分層式結構通常分爲三層,從下至上分別爲:數據訪問層、業務邏輯層(又或成爲領域層)、表示層,如圖所示:
圖一:三層的分層式結構
數據訪問層:有時候也稱爲是持久層,其功能主要是負責數據庫的訪問。簡單的說法就是實現對數據表的Select,Insert,Update,Delete的操做。若是要加入ORM的元素,那麼就會包括對象和數據表之間的mapping,以及對象實體的持久化。在PetShop的數據訪問層中,並無使用ORM,從而致使了代碼量的增長,能夠看做是整個設計實現中的一大敗筆。
業務邏輯層:是整個系統的核心,它與這個系統的業務(領域)有關。以PetShop爲例,業務邏輯層的相關設計,均和網上寵物店特有的邏輯相關,例如查詢寵物,下訂單,添加寵物到購物車等等。若是涉及到數據庫的訪問,則調用數據訪問層。
表示層:是系統的UI部分,負責使用者與整個系統的交互。在這一層中,理想的狀態是不該包括系統的業務邏輯。表示層中的邏輯代碼,僅與界面元素有關。在PetShop中,是利用ASP.Net來設計的,所以包含了許多Web控件和相關邏輯。
分層式結構究竟其優點何在?Martin Fowler在《Patterns of Enterprise Application Architecture》一書中給出了答案:
一、開發人員能夠只關注整個結構中的其中某一層;
二、能夠很容易的用新的實現來替換原有層次的實現;
三、能夠下降層與層之間的依賴;
四、有利於標準化;
五、利於各層邏輯的複用。
歸納來講,分層式設計能夠達至以下目的:分散關注、鬆散耦合、邏輯複用、標準定義。
一個好的分層式結構,可使得開發人員的分工更加明確。一旦定義好各層次之間的接口,負責不一樣邏輯設計的開發人員就能夠分散關注,齊頭並進。例如UI人員只需考慮用戶界面的體驗與操做,領域的設計人員能夠僅關注業務邏輯的設計,而數據庫設計人員也沒必要爲繁瑣的用戶交互而頭疼了。每一個開發人員的任務獲得了確認,開發進度就能夠迅速的提升。
鬆散耦合的好處是顯而易見的。若是一個系統沒有分層,那麼各自的邏輯都牢牢糾纏在一塊兒,彼此間相互依賴,誰都是不可替換的。一旦發生改變,則牽一髮而動全身,對項目的影響極爲嚴重。下降層與層間的依賴性,既能夠良好地保證將來的可擴展,在複用性上也是優點明顯。每一個功能模塊一旦定義好統一的接口,就能夠被各個模塊所調用,而不用爲相同的功能進行重複地開發。
進行好的分層式結構設計,標準也是必不可少的。只有在必定程度的標準化基礎上,這個系統纔是可擴展的,可替換的。而層與層之間的通訊也必然保證了接口的標準化。
「金無足赤,人無完人」,分層式結構也不可避免具備一些缺陷:
一、下降了系統的性能。這是不言而喻的。若是不採用分層式結構,不少業務能夠直接造訪數據庫,以此獲取相應的數據,現在卻必須經過中間層來完成。
二、有時會致使級聯的修改。這種修改尤爲體如今自上而下的方向。若是在表示層中須要增長一個功能,爲保證其設計符合分層式結構,可能須要在相應的業務邏輯層和數據訪問層中都增長相應的代碼。
前面提到,PetShop的表示層是用ASP.Net設計的,也就是說,它應是一個BS系統。在.Net中,標準的BS分層式結構以下圖所示:
圖二:.Net中標準的BS分層式結構
隨着PetShop版本的更新,其分層式結構也在不斷的完善,例如PetShop2.0,就沒有采用標準的三層式結構,如圖三:
圖三:PetShop 2.0的體系架構
從圖中咱們能夠看到,並無明顯的數據訪問層設計。這樣的設計雖然提升了數據訪問的性能,但也同時致使了業務邏輯層與數據訪問的職責混亂。一旦要求支持的數據庫發生變化,或者須要修改數據訪問的邏輯,因爲沒有清晰的分層,會致使項目做大的修改。而隨着硬件系統性能的提升,以及充分利用緩存、異步處理等機制,分層式結構所帶來的性能影響幾乎能夠忽略不計。
PetShop3.0糾正了此前層次不明的問題,將數據訪問邏輯做爲單獨的一層獨立出來:
圖四:PetShop 3.0的體系架構
PetShop4.0基本上延續了3.0的結構,但在性能上做了必定的改進,引入了緩存和異步處理機制,同時又充分利用了ASP.Net 2.0的新功能MemberShip,所以PetShop4.0的系統架構圖以下所示:
圖五:PetShop 4.0的體系架構
比較3.0和4.0的系統架構圖,其核心的內容並無發生變化。在數據訪問層(DAL)中,仍然採用DAL Interface抽象出數據訪問邏輯,並以DAL Factory做爲數據訪問層對象的工廠模塊。對於DAL Interface而言,分別有支持MS-SQL的SQL Server DAL和支持Oracle的Oracle DAL具體實現。而Model模塊則包含了數據實體對象。其詳細的模塊結構圖以下所示:
圖六:數據訪問層的模塊結構圖
能夠看到,在數據訪問層中,徹底採用了「面向接口編程」思想。抽象出來的IDAL模塊,脫離了與具體數據庫的依賴,從而使得整個數據訪問層利於數據庫遷移。DALFactory模塊專門管理DAL對象的建立,便於業務邏輯層訪問。SQLServerDAL和OracleDAL模塊均實現IDAL模塊的接口,其中包含的邏輯就是對數據庫的Select,Insert,Update和Delete操做。由於數據庫類型的不一樣,對數據庫的操做也有所不一樣,代碼也會所以有所區別。
此外,抽象出來的IDAL模塊,除了解除了向下的依賴以外,對於其上的業務邏輯層,一樣僅存在弱依賴關係,以下圖所示:
圖七:業務邏輯層的模塊結構圖
圖七中BLL是業務邏輯層的核心模塊,它包含了整個系統的核心業務。在業務邏輯層中,不能直接訪問數據庫,而必須經過數據訪問層。注意圖中對數據訪問業務的調用,是經過接口模塊IDAL來完成的。既然與具體的數據訪問邏輯無關,則層與層之間的關係就是鬆散耦合的。若是此時須要修改數據訪問層的具體實現,只要不涉及到IDAL的接口定義,那麼業務邏輯層就不會受到任何影響。畢竟,具體實現的SQLServerDAL和OracalDAL根本就與業務邏輯層沒有半點關係。
由於在PetShop 4.0中引入了異步處理機制。插入訂單的策略能夠分爲同步和異步,二者的插入策略明顯不一樣,但對於調用者而言,插入訂單的接口是徹底同樣的,因此PetShop 4.0中設計了IBLLStrategy模塊。雖然在IBLLStrategy模塊中,僅僅是簡單的IOrderStategy,但同時也給出了一個範例和信息,那就是在業務邏輯的處理中,若是存在業務操做的多樣化,或者是從此可能的變化,均應利用抽象的原理。或者使用接口,或者使用抽象類,從而脫離對具體業務的依賴。不過在PetShop中,因爲業務邏輯相對簡單,這種思想體現得不夠明顯。也正由於此,PetShop將核心的業務邏輯都放到了一個模塊BLL中,並無將具體的實現和抽象嚴格的按照模塊分開。因此表示層和業務邏輯層之間的調用關係,其耦合度相對較高:
圖八:表示層的模塊結構圖
在圖五中,各個層次中還引入了輔助的模塊,如數據訪問層的Messaging模塊,是爲異步插入訂單的功能提供,採用了MSMQ(Microsoft Messaging Queue)技術。而表示層的CacheDependency則提供緩存功能。這些特殊的模塊,我會在此後的文章中詳細介紹。
引用地址:http://www.cnblogs.com/wayfarer/archive/2006/04/14/375382.html