本文示例代碼
一、CreateNew Attribute實現屬性注入
Steps:
1/ aspx創建某個服務的屬性。
2/ 為其添加[CreateNew] Attribute。
3/ 頁面繼承自Microsoft.PRactices.CompositeWeb.Web.UI.Page,而非System.Web.UI.Page。
1 public partial class Sample : Microsoft.Practices.CompositeWeb.Web.UI.Page2 {3 [CreateNew]4 public ComputeService ServiceForCompute5 {6 set;7 get;8 }9 }運行頁面。黃頁,發生錯誤。

解決辦法:
4/ 為web site添加Globe文件,使application繼承自Microsoft.Practices.CompositeWeb.WebClientApplication。
1 <%@ Application Language="C#" Inherits="Microsoft.Practices.CompositeWeb.WebClientApplication" %>
二、InjectionMethod Attribute
在class中,[InjectionMethod]修飾過的方法將在該類實例化的時候執行,僅次于類的constructor。
三、使用StateValue<T>進行值的持久化
StateValue<T>值的存取是通過session來完成的,這也就實現了變量的持久化。
Steps:
1/ 聲明一StateValue<int>變量。
2/ 在class的初始化方法中(標記了[InjectionMethod]的方法),通過StateDependency為其注入指定Key值的Session。
3/ 頁面可以任意的對其賦值、取值。
1 private StateValue<int> m_ResultValue; 2 public int ResultValue 3 { 4 get 5 { 6 return m_ResultValue.Value; 7 } 8 set 9 {10 m_ResultValue.Value = value;11 }12 }13 14 [InjectionMethod]15 public void InitState([StateDependency("result")]StateValue<int> resultValue)16 {17 m_ResultValue = resultValue;18 }[StateDependency("result")]意味著parameter resultValue的內容從Session["result"]注入。
四、InjectionConstructor Attribute
用來修飾類的構造函數,指明該類需被某處注入時,默認調取的constructor。一個class中,最多有一個構造函數可標記該標簽。
五、module services的注冊和使用
(1) 以module為單位對其內的Services進行注冊。
Steps:
1/ 為每一module創建一個(且只創建一個)繼承自ModuleInitializer的類,override其中的Load方法,完成服務的注冊。
1 public override void Load(CompositionContainer container) 2 { 3 base.Load(container); 4 5 AddModuleServices(container.Services); 6 } 7 8 protected virtual void AddModuleServices(IServiceCollection moduleServices) 9 {10 moduleServices.AddNew<SecondService, ISecondService>();11 }2/ 在Web.config中配置需加載的modules。
1 <module name="Calculation" assemblyName="Modules" virtualPath="~/"></module>
assemblyName指明需注冊Services的dll來源。在站點初始化的時候,通過指定的dll,由反射的方式找到其中繼承自ModuleInitializer的類,完成容器內服務的注冊。
(2) 由ServiceDependency標簽使用依賴注入容器內的服務
Interface被ServiceDependency標記,意味著從容器內獲取其實現類。
1 [InjectionConstructor]2 public ComputeService([ServiceDependency] ISecondService secondService)3 {4 this.m_SecondCalculateService = secondService;5 }新聞熱點
疑難解答