我正在开发一个框架扩展,它使用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甚至不打算以这种方式使用?
除非您想要更改或扩展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)