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