使用Ninject实现后期绑定

4
我正在开发一个框架扩展,使用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个回答

7

除非你想要修改或扩展Ninject的内部,否则你不需要将任何内容添加到内核上的Components集合中。要确定类型是否可用绑定,可以执行以下操作:

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

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

0

回答非常晚,但是Microsoft.Practices.Unity可以通过App.Config实现后期绑定

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接