? ? ? ? PetShop是一個范例,微軟用它來展示.Net企業系統開發的能力。PetShop隨著版本的不斷更新,至現在基于.Net2.0的PetShop 4.0為止,整個設計逐漸變得成熟而優雅,有很多可以借鑒之處。PetShop是一個小型的項目,系統架構與代碼都比較簡單,卻也凸現了許多頗有價值的設計與開發理念。
1.PetShop項目標準B/S分層式結構圖?
? ? ? ? PetShop的表示層是用ASP.Net設計的,也就是說,它應是一個B/S系統。在.Net中,標準的B/S分層式結構如圖1所示。
圖1 Net中標準的BS分層式結構?
2.?PetShop 2.0的體系架構
? ? ? ? 隨著PetShop版本的更新,其分層式結構也在不斷完善,例如PetShop 2.0,就沒有采用標準的三層式結構。如圖2所示。
?圖2?PetShop2.0的體系架構
? ? ? ? 從圖2中可以看到,并沒有明顯的數據訪問層設計。這樣的設計雖然提高了數據訪問的性能,但也同時導致了業務邏輯層與數據訪問層的職責混亂。一旦要求支持的數據庫發生變化,或者需要修改數據訪問的邏輯,由于沒有清晰的分層,會導致項目做大的修改。而隨著硬件系統性能的提高,以及充分利用緩存、異步處理等機制,分層式結構所帶來的性能影響幾乎可以忽略不計。
3.?PetShop 3.0的體系架構
? ? ? ? PetShop 3.0糾正了此前層次不明的問題,將數據訪問邏輯作為單獨的一層獨立出來。PetShop 3.0的體系架構如圖3所示。? ? ? ?
?圖3?PetShop 3.0的體系架構
4.?PetShop 4.0的體系架構?
? ? ? ? ?PetShop 4.0基本上延續了3.0的結構,但在性能上作了一定的改進,引入了緩存和異步處理機制,同時又充分利用了ASP.Net 2.0的新功能Membership。因此,PetShop 4.0的系統架構如圖4所示。
圖4?PetShop 4.0的體系架構?
4.1?數據訪問層的模塊結構圖?
? ? ? ? 比較3.0和4.0的系統架構圖,其核心的內容并沒有發生變化。在數據訪問層(DAL)中,仍然采用DAL?Interface抽象出數據訪問邏輯,并以DAL Factory作為數據訪問層對象的工廠模塊。對于DAL?Interface而言,分別有支持MS-SQL的SQL Server DAL和支持Oracle的Oracle DAL具體實現,而Model模塊則包含了數據實體對象,其詳細的模塊結構如圖5所示。
圖5?數據訪問層的模塊結構圖?
? ? ? ? ?可以看到,在數據訪問層中,完全采用了“面向接口編程”思想。抽象出來的IDAL模塊,脫離了與具體數據庫的依賴,從而使得整個數據訪問層有利于數據庫遷移。DALFactory模塊專門管理DAL對象的創建,便于業務邏輯層訪問。SQLServerDAL和OracleDAL模塊均實現IDAL模塊的接口,其中包含的邏輯就是對數據庫的Select、Insert、Update和Delete操作。因為數據庫類型的不同,對數據庫的操作也有所不同,代碼也會因此有所區別。
4.2業務邏輯層的模塊結構圖?
? ? ? ? 此外,抽象出來的IDAL模塊,除了解除了向下的依賴之外,對于其上的業務邏輯層同樣僅存在弱依賴關系,如圖6所示。
圖6?業務邏輯層的模塊結構圖?
? ? ? ? 圖6中,BLL是業務邏輯層的核心模塊,它包含了整個系統的核心業務。在業務邏輯層中,不能直接訪問數據庫,而必須通過數據訪問層。注意,圖6中對數據訪問業務的調用,是通過接口模塊IDAL來完成的。既然與具體的數據訪問邏輯無關,則層與層之間的關系就是松散耦合的。如果此時需要修改數據訪問層的具體實現,只要不涉及IDAL的接口定義,那么業務邏輯層就不會受到任何影響。畢竟,具體實現的SQLServerDAL和OracleDAL根本就與業務邏輯層沒有半點關系。
? ? ? ? 因為在PetShop 4.0中引入了異步處理機制,插入訂單的策略可以分為同步和異步,兩者的插入策略明顯不同。但對于調用者而言,插入訂單的接口是完全一樣的,所以PetShop 4.0中設計了IBLLStrategy模塊中,僅僅是簡單的IOrderStrategy,但同時也給出了一個范例和信息,那就是在業務邏輯的處理中,如果存在業務操作的多樣化或者是今后可能的變化,均應利用抽象的原理、或者使用接口、或者使用抽象類,從而脫離對具體業務的依賴。不過在PetShop中,由于業務邏輯相對簡單,這種思想體現得不夠明顯。也正因為此,PetShop將核心的業務邏輯都放到了一個模塊BLL中,并沒有將具體的實現和抽象嚴格地按照模塊分開。所以表示層和業務邏輯層之間的調用關系,其耦合度相對較高。
4.3表示層的模塊結構??
? ? ? ? 圖7表示層的模塊結構圖中,各個層次中還引入了輔助的模塊,如數據訪問層的Messaging模塊,是為異步插入訂單的功能提供,采用了MSMQ(Microsoft?Messaging?Queue·)技術,而表示層的CacheDependency則提供緩存功能。?
圖7?表示層的模塊結構?