Hangfire配置和Ninject配置

时间:2015-06-16 00:21:10

标签: c# asp.net-mvc-5 ninject 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;
    }
}

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接口,我应该在OWIN启动方法中添加Hangfire Ninject配置(已经放置了Hangfire配置)。我应该如何获得当前的Ninject内核(NinjectWebCommon配置的内核?
  • 执行顺序怎么样?在OWIN启动之前或之后执行WebActivatorEx吗?
  • 如果我尝试两次执行配置会怎样?

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

1 个答案:

答案 0 :(得分:11)

  

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

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

GlobalConfiguration.Configuration.UseNinjectActivator(
                                     new Ninject.Web.Common.Bootstrapper().Kernel);

并且您将拥有相同的IKernel实例,包含您在NinjectWebCommon.RegisterServices

中配置的任何绑定
  

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

在。您可以通过在每个中设置断点来验证这一点(就像我一样)。 More info

  

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

     

如果我尝试两次执行配置会怎样?

内核配置是“组合​​根”。据该主题的杰出专家马克·西曼所说,should only be one of these in the applicationit should be as close as possible to the application's entry point.