与Ninject的后期绑定

时间:2009-12-27 07:20:30

标签: ninject

我正在开发一个框架扩展,它使用Ninject作为IoC容器来处理动态注入,但是我在尝试解决这个问题时遇到了一些麻烦。

我的框架的期望是你将传递IModule(s)所以它可以很容易地用在MVC,WebForms等中。所以我的课程结构如下:

public class NinjectFactory : IFactory, IDisposable {
  readonly IKernel kernel;
  public NinjectFactory(IModule[] modules) {
    kernel = new StandardKernel(modules);
  }
}

这没关系,我可以在单元测试中创建一个实例并传入IModule的基本实现(使用InlineModule中的构建,似乎建议用于测试)。

问题是,直到运行时我才知道需要注入的类型,并且通过我正在扩展的框架请求它们,这样的方法:

public IInterface Create(Type neededType) {

}

这里是我难倒的地方,我不确定检查的最佳方式 - >创建(如果需要) - >返回,我到目前为止:

public IInterface Create(Type neededType) {
  if(!kernel.Components.Has(neededType)) {
    kernel.Components.Connect(neededType, new StandardBindingFactory());
  }
}

这会将它添加到组件集合中,但如果它创建了一个实例,或者我如何创建一个实例并传入.ctor的参数,我就无法解决。

我是以正确的方式进行此事,还是Ninject甚至不打算以这种方式使用?

2 个答案:

答案 0 :(得分:7)

除非您想要更改或扩展Ninject的内部,否则您无需向内核上的Components集合添加任何内容。要确定某个类型的绑定是否可用,您可以执行以下操作:

Type neededType = ...;
IKernel kernel = ...;

var registry = kernel.Components.Get<IBindingRegistry>();
if (registry.Has(neededType)) {
  // Ninject can activate the type
}

答案 1 :(得分:0)

答案很晚,但是 Microsoft.Practices.Unity 允许通过App.Config进行后期绑定

以防万一有人遇到这个问题