Настройка 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 между двумя?

1 ответ

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

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

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

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

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

До. Вы можете проверить это (как я сделал), установив точки останова в каждом. Больше информации

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

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

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

Другие вопросы по тегам