我最近尝试了扩展名为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
方法的目的是什么? 最佳答案
OnePerRequestModule
在每个HTTP请求完成后从内核的Cache中删除InRequestScope()
d个对象。NinjectHttpApplication
ctor被称为多次,因为IIS创建了多个。一个NinjectHttpApplication
一次只能处理一个请求。因此,IIS每个线程生成(至少)一个实例。StartManaging
告诉所有OnePerRequestModules
他们将在请求结束后从指定的内核释放InRequestScoped
对象。