20

我有一个使用 Ninject 的 MVC 5 应用程序,我正在向其中添加 Hangfire。

添加 Ninject 后,我​​使用了NinjectWebCommonnuget 包,因为它配置简单。所以现在 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 配置的内核?
  • 执行顺序呢?是在WebActivatorExOWIN 启动之前还是之后执行?
  • 如果我尝试执行两次配置会发生什么?

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

4

1 回答 1

12

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

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

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

并且您将拥有相同的IKernel实例,并包含您在其中配置的任何绑定NinjectWebCommon.RegisterServices

执行顺序呢?是在WebActivatorExOWIN 启动之前还是之后执行?

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

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

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

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

于 2015-06-23T21:46:48.277 回答