2

我一直在尝试在 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 容器)使用静态字段?

4

0 回答 0