Ninject и OnePerRequestModule - PullRequest
       5

Ninject и OnePerRequestModule

12 голосов
/ 16 февраля 2011

Я недавно опробовал 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 Ответ

13 голосов
/ 17 февраля 2011

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

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

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

...