Ninject и OnePerRequestModule
Недавно я опробовал 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
, если конструктор вызывается несколько раз?
Ответы
Ответ 1
OnePerRequestModule
удаляет InRequestScope()
d объекты из ядра Cache после завершения каждого HTTP-запроса.
NinjectHttpApplication
ctor называется многократным, потому что IIS создает несколько из них. Один NinjectHttpApplication
может обрабатывать только один запрос за раз. Таким образом, IIS генерирует (по крайней мере) один экземпляр для потока.
StartManaging
сообщает всем OnePerRequestModules
, что они освободят объекты InRequestScoped
из указанного ядра после завершения запроса.