c# - net - Configuración Hangfire y configuración Ninject
hangfire server (1)
¿Cómo debo obtener el kernel de Ninject actual?
Mirar el código de Ninject.Web.Common.Bootstrapper
muestra que almacena una única instancia estática del kernel y la expone a través de la propiedad Kernel
. Esto significa que puede hacer esto dentro del método de inicio OWIN:
GlobalConfiguration.Configuration.UseNinjectActivator(
new Ninject.Web.Common.Bootstrapper().Kernel);
y tendrá la misma instancia de IKernel
, completa con cualquier NinjectWebCommon.RegisterServices
que haya configurado en NinjectWebCommon.RegisterServices
¿Qué pasa con la orden de ejecución? ¿Se
WebActivatorEx
ejecutandoWebActivatorEx
antes o después del inicio de OWIN?
Antes de. Puedes verificar esto (como lo hice) estableciendo puntos de interrupción en cada uno. Más información
Más en general, ¿cómo puedo compartir la configuración de Ninject entre los dos?
¿Qué pasa si trato de ejecutar la configuración dos veces?
La configuración del kernel es la "raíz de la composición". Según Mark Seemann, un experto preeminente en el tema, solo debe haber uno de estos en la solicitud , y debe estar lo más cerca posible del punto de entrada de la aplicación.
Tengo una aplicación MVC 5 que usa Ninject y le estoy agregando Hangfire.
Cuando agregué Ninject, usé el paquete NinjectWebCommon
NinjectWebCommon debido a su simplicidad en la configuración. Por ahora, Ninject se configura a través de la clase NinjectWebCommon
, que crea un kernel estándar y agrega los enlaces.
Además, he creado un módulo personalizado que cargo al crear el kernel
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;
}
}
El Ninject Web Common se registra a través de la clase WebActivatorEx
[assembly: WebActivatorEx.PreApplicationStartMethod( typeof( MyProject.Web.NinjectWebCommon ), "Start" )]
[assembly: WebActivatorEx.ApplicationShutdownMethodAttribute( typeof( MyProject.Web.NinjectWebCommon ), "Stop" )]
Ahora el problema está relacionado con cómo hacer que Hangfire vea la configuración de Ninject. Al mirar el paquete Hangfire.Ninject
puedo leer
El paquete proporciona un método de extensión para la interfaz IGlobalConfiguration:
var kernel = new StandardKernel();
GlobalConfiguration.Configuration.UseNinjectActivator(kernel);
Ahora mi pregunta es:
- Debido a la interfaz
IGlobalConfiguration
, debo agregar la configuración de Hangfire Ninject dentro del método de inicio OWIN (donde ya se encuentra la configuración de Hangfire). ¿Cómo debo obtener el kernel de Ninject actual (el que NinjectWebCommon ha configurado? - ¿Qué pasa con la orden de ejecución? ¿Se
WebActivatorEx
ejecutandoWebActivatorEx
antes o después del inicio de OWIN? - ¿Qué pasa si trato de ejecutar la configuración dos veces?
Más en general, ¿cómo puedo compartir la configuración de Ninject entre los dos?