程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> Duwamish深入剖析-結構篇

Duwamish深入剖析-結構篇

編輯:.NET實例教程
-------------------------------------------------------------------------------
  
  目錄:
  
  引言
  
  Duwamish介紹
  
  結構分析
  
  設計思想
  
  代碼示例
  
  總結
  
  作者
  
  
  --------------------------------------------------------------------------------
  
  引言:
  
  能夠作為Visual Studio .Net附帶的例子,Duwamish一定包含了微軟.Net設計隊伍希望向開發者傳達的某些信息,而事實上,Duwamish也的確能夠稱作是一個.Net開發者學習的經典示例,無論是從其設計架構,編程技巧或代碼風格,都向我們展示了一個標准的.Net企業級應用程序所應該具有的特點。所以,通過研究Duwamish示例,高手能夠領悟到.Net應用架構的設計思想,低手能夠學習到.Net的編程技巧,實在是老少皆宜。 :)
  
  不過,本文的目的更多的是針對中級.Net學習者,這類讀者往往已經熟悉了C#或者是VB.Net的語法,會用一些基本的類庫,並已經會做一些比較小的程序。但是當他們開始著手開發一個真正具有實用價值的企業級應用的時候,卻有種無處下手的感覺。如果你正巧屬於這類學習者,請跟著我深入到Duwamish的世界中去,相信你一定會得到收獲。
  
  
  --------------------------------------------------------------------------------
  
  Duwamish介紹:
  
  Microsoft公司每次推出新技術,總是會相應的推出一些公開源代碼的應用范例來說明該項新技術的特點,而開發者也能通過研究該范例的代碼來達到迅速掌握新技術並與以實施的目的。Microsoft通過對一個虛擬的在網上銷售圖書的電子商務公司網上銷售系統應用的創建,向用戶展現了典型的網上購物實踐中最為普遍的電子商務企業對客戶 (B2C) 模式,它包括成員資格、帳戶管理、購物車、搜索和結帳過程等基本功能。Duwamish經歷了三個版本4.0,5.0和7.0版,每一個版本的發布都印證了技術進步的過程,每一個版本都代表了當時最先進的技術動向。這裡將要研究和討論的是Duwamish的最高版本7.0版,經歷了COM/COM+技術以及Microsoft DNA架構的Duwamish,在最新的版本中完全采用了.Net技術及架構,比以前顯得更加先進和成熟。
  
  
  
  
  如果您安裝了Visual Studio .Net的話,您可以在您的VS.Net 的Enterprise Samples目錄下找到並安裝它,例如:C:\Program Files\Microsoft Visual Studio .NET\Enterprise Samples\,或者您還可以到http://astradigital.com/Duwamish7Vb/這個地址去看看它在Internet的一個演示實例。其它有關Duwamish的詳細介紹資料請參考Visual Studio .Net附帶的MSDN幫助,地址是:ms-help://MS.VSCC/MS.MSDNVS.2052/dwamish7/Html/vtoriDuwamishBooks70.htm,這裡不再贅述。


  
  
  --------------------------------------------------------------------------------
  
  Duwamish結構分析:
  
  Duwamish 7.0 是一個典型的N層架構,其結構分為四個邏輯層:
  
  Web 層
  
  Web 層為客戶端提供對應用程序的訪問。這一層是作為 Duwamish.sln 解決方案文件中的 Web 項目實現的。Web 層由 ASP.Net Web 窗體和代碼隱藏文件組成。Web 窗體只是用 Html 提供用戶操作,而代碼隱藏文件實現各種控件的事件處理。
  
  業務外觀層
  
  業務外觀層為 Web 層提供處理帳戶、類別浏覽和購書的界面。這一層是作為 Duwamish.sln 解決方案文件中的 BusinessFacade 項目實現的。業務外觀層用作隔離層,它將用戶界面與各種業務功能的實現隔離開來。除了低級系統和支持功能之外,對數據庫服務器的所有調用都是通過此程序集進行的。
  
  業務規則層
  
  業務規則層是作為 Duwamish.sln 解決方案文件中的 BusinessRules 項目實現的,它包含各種業務規則和邏輯的實現。業務規則完成如客戶帳戶和書籍訂單的驗證這樣的任務。
  
  數據訪問層
  
  數據訪問層為業務規則層提供數據服務。這一層是作為 Duwamish.sln 解決方案文件中的 DataAccess 項目實現的。
  
  比較令人困惑的是其中的業務外觀層和業務規則層,很多人在學習N層結構開發的時候,聽得最多的是三層結構,分別為:表示層,中間層和數據層。Duwamish的WEB層和數據訪問層比較好理解,也就是傳統意義上的表示層和數據層,那麼業務外觀層和業務規則層和我們熟悉的中間層有什麼聯系呢?
  
  
  --------------------------------------------------------------------------------
  
  設計思想:
  
  在Web應用程序中,有部分操作只是簡單的從數據庫根據條件提取數據,不需要經過任何處理,而直接將數據顯示到網頁上,比如查詢某類別的圖書列表。而另外一些操作,比如計算定單中圖書的總價並根據顧客的級別計算回扣等等,這部分往往有許多不同的功能的類,操作起來也比較復雜。我們可以先想象一下,如果我們采用三層結構,這些商業邏輯一般是會放在中間層,那麼對內部的這些大量種類繁多,使用方法也各異的不同的類的調用任務,就完全落到了表示層。這樣勢必會增加表示層的代碼量,將表示層的任務復雜化,和表示層只負責接受用戶的輸入並返回結果的任務不太相稱,並增加了層與層之間的耦合程度。
  
  為了解決這個問題,我們先來看看《設計模式》一文中對Facade模式的描述:
  
  意圖:
  
  為子系統中的一組接口提供一個一致的界面,Facade模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。
  
  適用性:
  
  當你要為一個復雜子系統提供一個簡單接口時。子系統往往因為不斷演化而變得越來越復雜。大多數模式使用時都會產生更多更小的類。這使得子系統更具可重用性,也更容易對子系統進行定制,但這也給那些不需要定制子系統的用戶帶來一些使用上的困難。Facade可以提供一個簡單的缺省視圖,這一視圖對大多數用戶來說已經足夠,而那些需要更多的可定制性的用戶可以越過Facade層。
  
  客戶程序與抽象類的實現部分之間存在著很大的依賴性。引入Facade將這個子系統與客戶以及其他的子系統分離,可以提高子系統的獨立性和可移植性。


  
  當你需要構建一個層次結構的子系統時,使用Facade模式定義子系統中每層的入口點。如果子系統之間是相互依賴的,你可以讓它們僅通過Facade進行通訊,從而簡化了它們之間的依賴關系。
  
  結構圖:
  
  
  
  
  上文提出的這個矛盾,正好和設計模式中Facade模式中所描述的需要解決的問題非常吻合,在《設計模式》中提出的解決的辦法就是引入一個Facade對象,讓這個Façade來負責管理系統內部類的調用,並為表示層提供了一個單一而簡單的接口。這個Façade對象,在我們的Duwamish的設計中,就是BusinessFacade(業務外觀)層。
  
  以下是Duwamish的結構關系圖:
  
  
  
  
  我們從圖中可以清楚的看到,浏覽器首先調用的是表示層WEB,然後WEB將請求發送給業務外觀層,業務外觀層對請求進行初步的處理,判斷是否需要調用業務規則層,還是直接調用數據訪問層獲取數據。最後由數據訪問層訪問數據庫並按照來時的步驟返回結果到浏覽器(對於圖中涉及到其它的結構模塊以後會分別予以詳細介紹)。
  
  
  --------------------------------------------------------------------------------
  
  代碼示例:
  
  以下是兩種不同處理路徑的代碼示例:
  
  獲取商品目錄
  
  表示層調用業務外觀層:
  
  productSystem = new ProductSystem();
  
  categorySet = productSystem.GetCategorIEs(categoryID);
  
  業務外觀層直接調用數據層:
  
  public CategoryData GetCategorIEs(int categoryId)
  {
   if ( dsCommand == null )
   {
   throw new System.ObjectDisposedException( GetType().FullName );
   }
   return FillCategoryData("GetCategorIEs", "@CategoryId", categoryId);
  }
  
  添加定單
  
  表示層調用業務外觀層:
  
  public void AddOrder()
  {
   ApplicationAssert.CheckCondition(cartOrderData != null, "Order requires data", ApplicationAssert.LineNumber);
   ApplicationLog.WriteTrace("Duwamish7.Web.Cart.AddOrder:\r\nCustomerId: " +
   cartOrderData.Tables[OrderData.CUSTOMER_TABLE].Rows[0][OrderData.PKID_FIELD].ToString());
   cartOrderData = (new OrderSystem()).AddOrder(cartOrderData);
  }


  
  業務外觀層調用業務規則層:
  
  public OrderData AddOrder(OrderData order)
  {
   ApplicationAssert.CheckCondition(order != null, "Order is required", ApplicationAssert.LineNumber);
  
   (new BusinessRules.Order()).InsertOrder(order);
   return order;
  }
  
  業務規則層調用數據層:
  
  public bool InsertOrder(OrderData order)
  {
   //此處省略復雜的處理邏輯
   if ( isValid )
   {
   using (DataAccess.Orders ordersDataAccess = new DataAccess.Orders())
   {
   return (ordersDataAccess.InsertOrderDetail(order)) > 0;
   }
   }
   else
   return false;
  }
  
  
  --------------------------------------------------------------------------------
  
  總結:
  
  通過分析Duwamish7的結構設計,我們掌握了Façade模式,並學習到了如何通過Façade模式對應用結構進行改進,同時了解了Duwamish7的基本概念和處理流程,為以後深入分析和學習Duwamish7的的其它部分打下了一個基礎。


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved