我正在开发一个框架扩展,它使用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甚至不打算以这种方式使用?
答案 0 :(得分:7)
除非您想要更改或扩展Ninject的内部,否则您无需向内核上的Components
集合添加任何内容。要确定某个类型的绑定是否可用,您可以执行以下操作:
Type neededType = ...;
IKernel kernel = ...;
var registry = kernel.Components.Get<IBindingRegistry>();
if (registry.Has(neededType)) {
// Ninject can activate the type
}
答案 1 :(得分:0)
答案很晚,但是 Microsoft.Practices.Unity 允许通过App.Config进行后期绑定
以防万一有人遇到这个问题