12

我最近尝试了Ninject扩展Ninject.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如果构造函数被多次调用,这个方法的目的是什么?
4

1 回答 1

13

在完成每个 HTTP 请求后,从内核的缓存OnePerRequestModule中删除InRequestScope()d 个对象。

NinjectHttpApplicationctor 被多次调用,因为 IIS 创建了其中的几个。一次NinjectHttpApplication只能处理一个请求。因此 IIS 每个线程(至少)生成一个实例。

StartManaging告诉所有人,在请求结束后OnePerRequestModules,他们应从指定的内核中释放对象。InRequestScoped

于 2011-02-17T09:27:17.000 回答