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