Duwamish是Microsoft提供一個企業級的分佈式系統架構,如果開發企業級的分佈式系統,可以模仿這種架構,如果是開發一些簡單的系統,則完全可以簡化。
以前也學習過Duwamish範例,只是發現不同時間,不同經歷,有不同的體會。正如盧彥所說的一樣:通過研究Duwamish示例,高手能夠領悟到.Net應用架構的設計思想,低手能夠學習到.Net的編程技巧,實在是老少皆宜。
因此,這裏再次學習並體驗一次Duwamish範例。
1,Duwamish 7.0 結構分爲四個邏輯層(FROM MSDN):
Web 層 - Presentation
Web 層爲客戶端提供對應用程序的訪問。這一層是作爲 Duwamish.sln 解決方案文件中的 Web 項目實現的。Web 層由 ASP.NET Web 窗體和代碼隱藏文件組成。Web 窗體只是用 HTML 提供用戶操作,而代碼隱藏文件實現各種控件的事件處理。
業務外觀層 - Business Facade
業務外觀層爲 Web 層提供處理帳戶、類別瀏覽和購書的界面。這一層是作爲 Duwamish.sln 解決方案文件中的 BusinessFacade 項目實現的。業務外觀層用作隔離層,它將用戶界面與各種業務功能的實現隔離開來。除了低級系統和支持功能之外,對數據庫服務器的所有調用都是通過此程序集進行的。
業務規則層 - Business Rules
業務規則層是作爲 Duwamish.sln 解決方案文件中的 BusinessRules 項目實現的,它包含各種業務規則和邏輯的實現。業務規則完成如客戶帳戶和書籍訂單的驗證這樣的任務。
數據訪問層 - Data Access
數據訪問層爲業務規則層提供數據服務。這一層是作爲 Duwamish.sln 解決方案文件中的 DataAccess 項目實現的。
除了上述四個邏輯層外,Duwamish 7.0 還包含封裝在 Duwamish.sln 解決方案文件中的 Common 項目內的共享函數。“通用”(Common) 層包含用於在各層間傳遞信息的數據集。Common 項目還包含 Duwamish.sln 解決方案文件中的 SystemFramework 項目內的應用程序配置和跟蹤類。
2,各個邏輯層之間的關係圖(FROM MSDN)及其調用Sequeance圖示例:
下面是Categories.aspx web頁面獲取Category的Description的整個調用過程。
(1)實例化ProductSystem對象
(2)調用ProductSystem的GetCategories()方法
(3)檢測參數的合法性
(4)創建Categories::DataAccess對象實例
(5)返回上述對象
(6)調用Categories::DataAccess對象的GetCategories()方法
(7)創建CategoryData::Common對象實例
(8)返回上述對象
(9)返回CategoryData::Common對象實例,該實例中已經包含了需要的數據
(10)返回CategoryData::Common對象實例給web/Client端
(11)檢測數據的合法性
(12)讀取並顯示結果:Category的Description
SystemFramework項目包含一些application需要的配置參數,ApplicationLog日誌類和ApplicationAssert參數校驗類。SystemFramework項目爲所有其他的項目所引用。
Common項目包含了用於在各層間傳遞信息的數據集,如上述的CategoryData繼承System.Data.DataSet,既不是所謂的typed DataSet,也不是一般的DataSet,不過簡單實用,這是基於.Net Remoting開發分佈式系統用來tier與tier之間交互數據的一種方法。Common項目也被其他的項目引用,SystemFramework項目除外。
BusinessFacade項目中所有的Classes繼承MarshalByRefObject class,顯然是讓準備將BusinessFacade tier部署爲Remote Objects。不過,實際上默認這裏並沒有將其部署爲Remote Objects,Web層仍然調用本地對象(《Duwamish部署方案篇》將分析這個問題)。
3,Summary
在開發基於.Net Framework企業級分佈式系統時,上述架構值得推薦,但也並非完美無暇,實際上存在一些值得改進的地方。顯然,不可能一個範例適合所有的實際情況麼,要求太苛刻了。其實,Enterprise Samples中的另外一個範例Fitch and Mather 7.0,其架構和Duwamish就有些不同了。
如果是開發本地的系統,就不要模仿Duwamish架構(看看上面獲取Category的Description調用過程就知道了,太費勁。),如Business Facade和Business Rules中Classes應採用fine-grained interface設計,層與層之間的交互參數也不必全部採用DataSet,適當的時候採用setter/getter就可以了,這樣不僅可以提高開發效率,而且有助於提高performance, maintainability and reusability。
轉自:http://www.cnblogs.com/rickie/archive/2004/10/29/57951.html