我一直在尝试在 ASP.NET MVC 4 应用程序中使用 LightInject,但发现了一些让我摸不着头脑的东西。我的代码如下所示:
public class MvcApplication : System.Web.HttpApplication {
private ServiceContainer container;
protected void Application_Start() {
RouteConfig.RegisterRoutes(RouteTable.Routes);
container = new ServiceContainer();
container.Register<IUserStore, MyUserStore>(new PerScopeLifetime());
container.EnableMvc();
}
protected void Application_AuthenticateRequest() {
var users = container.GetInstance<IUserStore>();
/* Do some stuff here! */
}
}
Application_AuthenticateRequest
正在爆炸,因为容器为空。现在,在过去,我总是将 IOC 容器之类的东西设为静态,但从未真正停下来考虑为什么……所以我尝试制作container
一个常规实例字段,然后 BOOM!没有任何效果。
MvcApplication
因此,我尝试在其中放置一个无参数构造函数Debugger.Break()
,看起来 IIS 正在实例化应用程序、运行Application_Start
、销毁该实例,然后实例化另一个以处理第一个传入请求。这是设计使然吗?我一直认为 IIS 会实例化你的应用程序一次并运行它,直到它被关闭或池被回收......但我现在意识到我不知道我从哪里得到这个想法。MSDN文档说“第一次在应用程序中请求 ASP.NET 页面或进程时,会创建 HttpApplication 类的新实例。但是,为了最大限度地提高性能,可能会为多个请求重用 HttpApplication 实例”——这表明 ASP.NET实际上可能会任意销毁和实例化应用程序实例。是这样吗?而且 - 如果是这样 - 我是否认为我应该只对需要在期间实例化Application_Start
然后可用于所有后续请求的任何东西(比如我的 IoC 容器)使用静态字段?