我有一个MVC5应用程序,它使用了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 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接口的原因,我应该在OWIN启动方法中添加Hangfire 配置(其中已经放置了Hangfire配置)。我应该如何获得当前的configured?
WebActivatorEx是在OWIN startup?更广泛地说,我如何在两者之间共享Ninject配置?
发布于 2015-06-24 05:46:48
如何获取当前的Ninject内核
查看Ninject.Web.Common.Bootstrapper的代码可以看出,它存储了内核的单个静态实例,并通过Kernel属性公开了它。这意味着您可以在OWIN启动方法中执行此操作:
GlobalConfiguration.Configuration.UseNinjectActivator(
new Ninject.Web.Common.Bootstrapper().Kernel);您将拥有相同的IKernel实例,其中包含您在NinjectWebCommon.RegisterServices中配置的所有绑定
执行的顺序是什么?
WebActivatorEx是在OWIN启动之前还是之后执行?
在此之前。您可以通过在每个断点中设置断点来验证这一点(就像我做的那样)。More info
更一般地说,我如何在两者之间共享
配置?
如果我尝试执行配置两次,会发生什么情况?
内核配置是“组合根”。根据该主题的杰出专家Mark Seemann的说法,there should only be one of these in the application和it should be as close as possible to the application's entry point.
https://stackoverflow.com/questions/30856995
复制相似问题