一、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.Page 2 { 3 [CreateNew] 4 public ComputeService ServiceForCompute 5 { 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 }