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

Конфигурация Hangfire и конфигурация Ninject

У меня есть приложение MVC 5, которое использует Ninject, и я добавляю к нему Hangfire.

Когда я добавил Ninject, я использовал пакет NinjectWebCommon nuget из-за его простоты в конфигурации. Итак, теперь Ninject настроен через класс NinjectWebCommon, который создает стандартное ядро ​​и добавляет привязки.

Кроме того, я создал некоторый пользовательский модуль, который я загружаю при создании ядра

private static IKernel CreateKernel() {
    var kernel = new StandardKernel( new MyCustomModule() );
    try {
        kernel.Bind<Func<IKernel>>().ToMethod( ctx => () => new Bootstrapper().Kernel );
        kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

        RegisterServices( kernel );
        return kernel;
    }
    catch {
        kernel.Dispose();
        throw;
    }
}

Ninject Web Common зарегистрирован в классе WebActivatorEx

[assembly: WebActivatorEx.PreApplicationStartMethod( typeof( MyProject.Web.NinjectWebCommon ), "Start" )]
[assembly: WebActivatorEx.ApplicationShutdownMethodAttribute( typeof( MyProject.Web.NinjectWebCommon ), "Stop" )]

Теперь проблема связана с тем, как заставить Hangfire видеть конфигурацию Ninject. Посмотрев пакет Hangfire.Ninject, я могу прочитать

В пакете предусмотрен метод расширения для IGlobalConfiguration Интерфейс:

var kernel = new StandardKernel(); GlobalConfiguration.Configuration.UseNinjectActivator(kernel);

Теперь мой вопрос:

  • Из-за интерфейса IGlobalConfiguration я должен добавить конфигурацию Hangfire Ninject внутри метода запуска OWIN (где уже установлена ​​конфигурация Hangfire). Как получить текущее ядро ​​Ninject (то, которое настроил NinjectWebCommon?)
  • Как насчет порядка исполнения? Выполняется ли WebActivatorEx до или после запуска OWIN?
  • Что произойдет, если я попытаюсь выполнить конфигурацию дважды?

В общем, как я могу поделиться конфигурацией Ninject между двумя?

4b9b3361

Ответ 1

Как получить текущее ядро ​​Ninject

Глядя на код Ninject.Web.Common.Bootstrapper показывает, что он хранит один статический экземпляр ядра и предоставляет его через Kernel свойство. Это означает, что вы можете сделать это внутри метода запуска OWIN:

GlobalConfiguration.Configuration.UseNinjectActivator(
                                     new Ninject.Web.Common.Bootstrapper().Kernel);

и у вас будет тот же экземпляр IKernel, в котором будут настроены все привязки, настроенные в NinjectWebCommon.RegisterServices

Как насчет порядка исполнения? Выполняется ли WebActivatorEx до или после запуска OWIN?

Перед. Вы можете проверить это (как я), установив точки останова в каждом. Подробнее

В общем, как я могу поделиться конфигурацией Ninject между двумя?

Что произойдет, если я попытаюсь выполнить конфигурацию дважды?

Конфигурация ядра - это "корень композиции". По словам Марка Семанна, выдающегося эксперта по этому вопросу, должен быть только одним из них в приложении, а он должен быть как можно ближе к точке входа приложения.