我可以以任何方式使用Ninject模块来约束请求的分辨率

时间:2014-09-24 19:47:07

标签: ninject ninject.web.mvc

在我们的网络项目中,我们使用的是Ninject。现在我们正在为我们的应用程序添加插件。我们希望插件能够添加自己的绑定。 Ninject模块似乎是解决这个问题的合理解决方案。

但是,我没有看到任何有关如何避免以下问题的指导。如果插件将绑定添加到已经具有绑定的接口,该怎么办?现在,DependencyResolver在尝试解析该接口时会抛出异常。

我试图更改我们的DependencyResolver,它不需要重写我们已在主应用程序中编写的所有绑定语句。我不希望插件能够破坏我的主要应用程序。如果插件需要应用约束来使其绑定起作用,那么它就是它的责任。

所以这就是我想要的。

  1. 插件无法破解核心应用或其他插件,因为它添加了绑定。
  2. 当我想添加一个带有自己绑定的新插件时,不需要对核心应用程序或其他插件进行任何更改
  3. 如果有多个实例可供选择,它应该执行"逻辑"事情。核心应用程序应该获得在没有新插件的情况下总是会得到的实例。该插件应该获取它专门绑定的实例。
  4. 似乎我应该能够覆盖StandardKernel的解析方法,以便它可以实现这些规则。似乎知道绑定所属的模块将有助于解决问题。但我无法找到模块或模块名称作为上下文,请求,绑定信息等的一部分。

    有关如何解决此问题的任何想法。我没有看到Ninject似乎回答了对模块化系统非常明显的需求。一个新模块不应该能够打破一个应用程序。 (它应该只能"打破"本身。)

1 个答案:

答案 0 :(得分:0)

你应该看看Ninject.Extensions.ChildKernel。您可以为每个插件创建一个ChildKernel,然后将插件模块加载到他们自己的ChildKernel中。

这意味着插件不能依赖于另一个插件的绑定,但插件可能依赖于父内核(根/应用程序内核)的绑定。因此,您可以为插件提供某些类型/服务。

顺便说一句,如果Ninject.Extensions.ChildKernel的实现不符合您的需求,您可能会选择实现自己的扩展。这不是那么多代码(见ChildKernel source