概述
使用Composite Web應用程式塊的好處是能夠將一個主要站台拆分為多個獨立的模組,每個模組負責主要站台中一個目錄及其所有內容。多個開發人員分別獨立負責不同的模組而不會相互幹涉。
添加Business modules
在業務模組中,可以添加任何與特定業務有關的應用,可以有頁面顯示,使用者控制項、工作流程、業務實體、資料訪問等,如所示:
添加一個新的業務模組,在解決方案管理器右鍵菜單中,選擇Web Client Factory->Add Business Module,如所示:
這裡我們添加一個Products業務模組
將會出現建立業務模組嚮導介面,在這裡我們選中Create Project for Unit Tests選項,將會為我們自動建立一個針對該業務模組的單元測試項目
建立完成後,可以在解決方案管理器中,看到如下結構:
可以看到,在網站中建立與業務模組的名稱相同的新頂層子目錄Products,並且在 Modules 目錄下建立新的類庫項目。該類庫項目用於包含與 /Products目錄下的一組頁面相關聯的任意商務邏輯。它包含表示器類 (DefaultViewPresenter) 和介面 (IDefaultView) 的定義,用於定義要由 /Products目錄下的 Default.aspx 頁面實現的視圖的方法。頂層控制器類也是在該項目中定義的,該類與視圖和表示器類相結合可完成此模組的頁面邏輯。還有一個ProductsModuleInitializer.cs 檔案,其中包含一個從 ModuleInitializer 繼承的 ProductsModuleInitializer 類,此類定義將在首次載入網站時調用的初始化方法,並且它為模組提供了初始化任意資料、註冊網站映射資訊等的方法。模組通過添加到 /Products 子目錄下的 web.config 檔案關聯到網站載入,該子目錄包含描述此模組的名稱、程式集和 URL 的複合 Web/模組下的條目:
<configuration><configSections><sectionGroup name="compositeWeb"><section name="modules" type="Microsoft.Practices.CompositeWeb.Configuration.ModulesConfigurationSection, Microsoft.Practices.CompositeWeb"/><section name="authorization" type="Microsoft.Practices.CompositeWeb.Configuration.AuthorizationConfigurationSection, Microsoft.Practices.CompositeWeb"/></sectionGroup></configSections><compositeWeb><modules><module name="Products" assemblyName="Products" virtualPath="~/Products"><dependencies><dependency module="Shell" /></dependencies></module></modules><authorization> </authorization></compositeWeb><appSettings/><connectionStrings/><system.web /></configuration>
現在我們運行程式後,可以看到,已經在左邊的導航樹中添加Products模組,並且提供了一個預設的視圖:
添加Service
為了後面的實現View-Presenter模式,這裡我們先添加一個Service。分別添加Product實體、IProductDataService介面、ProductDataService實現,如下程式碼範例:
Product實體:
public class Product{private string _name = string.Empty;private string _brand = string.Empty;/// <summary>/// 名稱/// </summary>public string Name{get { return _name; }set { _name = value; }}/// <summary>/// 品牌/// </summary>public string Brand{get { return _brand; }set { _brand = value; }}}
IProductDataService介面:
public interface IProductDataService{Product GetProductById(string id);}
ProductDataService實現,這雷根據ID從資料庫中讀取
public class ProductDataService : IProductDataService{public Product GetProductById(string id){// 這雷根據ID從資料庫中讀取:)Product product = new Product();product.Name = "Computer";product.Brand = "Lenovo";return product;}}
註冊服務和使用服務
在ProductsModuleInitializer.cs中我們可以找到AddModuleServices、AddGlobalServices這樣兩個方法,如果要添加的服務只在當前模組中使用,可以使用AddModuleServices,如果添加的服務在其他模組中也可以使用,使用AddGlobalServices方法。
protected virtual void AddModuleServices(IServiceCollection moduleServices){moduleServices.AddNew<ProductDataService, IProductDataService>();}
註冊完服務後,就可以用Dependency Injection來使用服務了,通過ServiceDependency特性來實現,開啟ProductsController.cs,添加如下代碼:
public class ProductsController{public ProductsController(){}private IProductDataService _productDataService;[ServiceDependency]public IProductDataService ProductDataService{set { _productDataService = value; }}public virtual Product GetProductById(string id){return _productDataService.GetProductById(id);}}
除了上面的方法之外,ServiceDependency特性還可以直接應用於方法的參數之上,如下代碼所示:
public class ProductsController{public ProductsController([ServiceDependency] IProductDataService productDataService){this._productDataService = productDataService;}private IProductDataService _productDataService;public virtual Product GetProductById(string id){return _productDataService.GetProductById(id);}}
結束語
Composite Web應用程式塊在Web Client Software Factory中經常與View-Presenter一起結合使用,限於篇幅,我把視圖、表示器放在下一篇中。