I have recently tried out Ninject
with the Ninject.Web.Mvc
extension, and I've noticed something peculiar and, while not breaking, confusing.
In the NinjectHttpApplication
abstract class, there is a constructor defined as follows..
/// <summary>
/// Initializes a new instance of the <see cref="NinjectHttpApplication"/> class.
/// </summary>
protected NinjectHttpApplication()
{
this.onePerRequestModule = new OnePerRequestModule();
this.onePerRequestModule.Init(this);
}
I have placed a debugger breakpoint here, and this gets called a few times. I cannot find any real documentation on it. In the implementation code, there is this line that catches my eye.
if (kernel.Settings.Get("ReleaseScopeAtRequestEnd", true))
{
OnePerRequestModule.StartManaging(kernel);
}
My questions are as follows...
- What is
OnePerRequestModule
- Why is this constructor being called multiple times?
- What is the purpose of this
StartManaging
method, if the constructor is called multiple times?
The
OnePerRequestModule
removesInRequestScope()
d objects from the Kernel's Cache upon completion of each HTTP Request.The
NinjectHttpApplication
ctor is called multiple time because IIS creates several of them. OneNinjectHttpApplication
can only handle one request at a time. So IIS generates (at least) one instance per thread.StartManaging
tells allOnePerRequestModules
that they shall release theInRequestScoped
objects from the specified Kernel after the Request has Ended.