在ASP.NET Web窗体应用程序中,推荐的方法是将容器存到由Application字典对象提供的全局状态。当需要的时候你可以访问容器,甚至使用HTTP模块自动完成对页面上控件的注入。
通常情况下,你应该使用Application字典对象来存储容器的单个实例。您可能决定创建主要容器的子容器,并将它们存储到每个用户的Session对象中,甚至是每个请求,在这些子容器中注册自定义类型和映射。但是,这可能降低应用的性能,通常应尽可能避免创建额外的容器。
ASP.NET应用程序实例化容器的技术方法及限制:
1基本方法。适合小项目
2依赖注入的推荐方法。能在运行时自动完成对页面控件的注入。
3.限制和替代途径。
基本方法
通过Global.asax文件的Application_Start事件来创建并构建容器。
依赖注入的推荐方法
虽然上面提供的方法为你访问容器提供了一种途径,但是存在一些限制。这意味着你必须编写代码来处理您需要的类的实例,而且减少了代码的可发现性(discoverability)和可测性。如果你使用Unity容器,那么一个更好的方法就是通过容器的每个请求都使用BuildUp方法来构建依赖。这意味着你只需要关心你的空间和类的应用合适的属性,或着在容器中配置注入注册和映射。在运行时注入需要的企业库对象和你自己的类。
一种方法是创建HTTP模块当一个页面加载的时候自动为所有依赖创建注入。为了做到这一点,你需要一个HTTP模块在页面初始化执行过程中执行代码,以填充依赖。还可以使用Global.asax中的Application_Start方法的来创建和填充容器,类HttpApplicationState的一个扩展方法将容器暴露给应用程序代码.一旦创建了这些,只需要应用配置中的一行可使你应用中的控件和类能够自动依赖注入。
为自动依赖注入准备一个ASP.NET应用
1.在工程中创建一个新的ASP.NET HTTP模块类(例如命名UnityHttpModule)捕获PreRequestHandlerExecute事件并执行遍历当前页请求的完全控制树的代码,应用Unity BuildUp 方法到每个控件。
2.编辑应用程序的Web.config文件添加新的HTTP模块,并将它放到其他HTTP模块之前,这样它就可以最先执行。下面描述怎么添加上一步的HTTP模块
3.创建一个类实现HttpApplicationState(提供一个访问容器的方法)的扩展方法,这个方法应该创建Unity容器并将它存储到Application字典中,如果存在则返回它的实例。
4.添加一个全局应用程序类文件(Global.asax中)到你的应用程序,并在Global.asax.cs中添加Application_Start事件处理代码。下面显示如何添加注册到特定的类型中,如IMyService, CustomerService, DataService
限制及替代方法
上述建议的技术不会自动执行构造注入到页面中的控件和类。它使用容器的BuildUp 方法,因为ASP.NET已经创建了控制和类的实例。这意味着自动构造注入不会发生。相反,你可以使用属性(setter)注入,或为类型创建控件和类的方法并定义参数加以解决,然后定义为使用属性或容器注册的InjectionMethod。这就构造了延迟构造。整个容器中Unity将决定参数的类型并调用方法。当然也可以存储一个实例在你的代码中处理对象。