Подтвердить что ты не робот

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, если конструктор вызывается несколько раз?
4b9b3361

Ответ 1

OnePerRequestModule удаляет InRequestScope() d объекты из ядра Cache после завершения каждого HTTP-запроса.

NinjectHttpApplication ctor называется многократным, потому что IIS создает несколько из них. Один NinjectHttpApplication может обрабатывать только один запрос за раз. Таким образом, IIS генерирует (по крайней мере) один экземпляр для потока.

StartManaging сообщает всем OnePerRequestModules, что они освободят объекты InRequestScoped из указанного ядра после завершения запроса.