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

我的框架的期望是您将传入 IModule(s) 以便它可以轻松地在 MVC、WebForms 等中使用。所以我的类结构如下:

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

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

问题是直到运行时我才知道我需要注入(inject)的类型,并且它们是通过我正在扩展的框架以这样的方法请求的:
public IInterface Create(Type neededType) {

}

这就是我难倒的地方,我不确定检查->创建(如果需要)->返回的最佳方法,到目前为止我有这个:
public IInterface Create(Type neededType) {
  if(!kernel.Components.Has(neededType)) {
    kernel.Components.Connect(neededType, new StandardBindingFactory());
  }
}

这会将它添加到 components 集合中,但我无法弄清楚它是否创建了一个实例,或者我如何创建一个实例并为 .ctor 传入参数。

我是否以正确的方式解决这个问题,或者 Ninject 甚至不打算以这种方式使用?

最佳答案

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

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

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

关于ninject - 与 Ninject 的后期绑定(bind),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1965421/

10-13 07:41