Ninject and OnePerRequestModule

12

我最近尝试使用 NinjectNinject.Web.Mvc 扩展,并且注意到了一些奇怪的东西,虽然没有破坏程序但是令人困惑。

NinjectHttpApplication 抽象类中,定义了一个构造函数,如下所示...

    /// <summary>
    /// Initializes a new instance of the <see cref="NinjectHttpApplication"/> class.
    /// </summary>
    protected NinjectHttpApplication()
    {
        this.onePerRequestModule = new OnePerRequestModule();
        this.onePerRequestModule.Init(this);
    }

我在这里设置了一个调试器断点,它被调用了几次。我找不到任何真实的文档来解释。在实现代码中,有一行代码引起了我的注意。

            if (kernel.Settings.Get("ReleaseScopeAtRequestEnd", true))
            {
                OnePerRequestModule.StartManaging(kernel);
            }

我的问题如下:

  • OnePerRequestModule是什么?
  • 为什么这个构造函数会被多次调用?
  • 如果构造函数被多次调用,那么StartManaging方法的目的是什么?

需要注意的是,如果您使用的是Ninject.Web.Mvc版本3.0,则不再需要在您的应用程序中手动注册OnePerRequestModule。这个模块已经包含在NuGet软件包中,并且将在您安装Ninject.Web.Mvc时自动注册。 - Ruben Bartelink
1个回答

13
OnePerRequestModule模块会在每个HTTP请求完成后从内核的Cache中移除使用InRequestScope()标注的对象。
由于IIS会创建多个NinjectHttpApplication实例,因此NinjectHttpApplication构造函数被调用多次。一个NinjectHttpApplication实例只能同时处理一个请求,所以IIS会至少为每个线程生成一个实例。 StartManaging会告知所有OnePerRequestModules在请求结束后释放指定内核中所有InRequestScoped对象。

那么这是我可以不用改动的东西吗?这不是我需要担心的事情吗? - Ciel
@Ciel Doc现在应该更清晰了,请参见https://dev59.com/rHDYa4cB1Zd3GeqPAXJ0#15786866和https://github.com/ninject/Ninject.Web.Common/wiki/InRequestScope。 - Ruben Bartelink

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接