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 甚至不打算以这种方式使用?

4

2 回答 2

7

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

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

var registry = kernel.Components.Get<IBindingRegistry>();
if (registry.Has(neededType)) {
  // Ninject can activate the type
}
于 2010-01-06T04:04:25.067 回答
0

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

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

于 2018-06-22T11:48:18.490 回答