与Ninject的后期绑定

Aar*_*ell 4 ninject

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

我的框架的期望是你将传入,IModule(s)所以它可以很容易地在MVC,WebForms等中使用.所以我有这样的类结构:

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

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

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

public IInterface Create(Type neededType) {

}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Nat*_*ari 7

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

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

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