Hangfire配置和Ninject配置

Lor*_*nzo 20 c# ninject asp.net-mvc-5 hangfire hangfire.ninject

我有一个使用Ninject的MVC 5应用程序,我正在添加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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Ninject Web Common是通过WebActivatorEx课程注册的

[assembly: WebActivatorEx.PreApplicationStartMethod( typeof( MyProject.Web.NinjectWebCommon ), "Start" )]
[assembly: WebActivatorEx.ApplicationShutdownMethodAttribute( typeof( MyProject.Web.NinjectWebCommon ), "Stop" )]
Run Code Online (Sandbox Code Playgroud)

现在问题与如何让Hangfire看到Ninject配置有关.通过查看Hangfire.Ninject我能读到的包裹

该包为IGlobalConfiguration接口提供了一个扩展方法:

var kernel = new StandardKernel(); GlobalConfiguration.Configuration.UseNinjectActivator(kernel);

现在我的问题是:

  • 由于IGlobalConfiguration接口,我应该在OWIN启动方法中添加Hangfire Ninject配置(已经放置了Hangfire配置).我应该如何获得当前的Ninject内核(NinjectWebCommon配置的内核)?
  • 执行的顺序怎么样?是WebActivatorEx的OWIN启动之前或之后执行?
  • 如果我尝试执行两次配置会发生什么?

更一般地说,我如何在两者之间共享Ninject配置?

Cra*_*yro 12

我该如何获得当前的Ninject内核

查看Ninject.Web.Common.Bootstrapper显示的代码,它存储内核的单个静态实例,并通过Kernel属性公开它.这意味着您可以在OWIN启动方法中执行此操作:

GlobalConfiguration.Configuration.UseNinjectActivator(
                                     new Ninject.Web.Common.Bootstrapper().Kernel);
Run Code Online (Sandbox Code Playgroud)

并且你将拥有相同的IKernel实例,完成你配置的任何绑定NinjectWebCommon.RegisterServices

执行的顺序怎么样?是WebActivatorEx的OWIN启动之前或之后执行?

之前.您可以通过在每个中设置断点来验证这一点(就像我一样).更多信息

更一般地说,我如何在两者之间共享Ninject配置?

如果我尝试执行两次配置会发生什么?

内核配置是"组合​​根".根据该主题的杰出专家Mark Seemann的说法,应用程序中应该只有其中一个,并且它应该尽可能接近应用程序的入口点.