我想让Ninject根据特定的枚举输入值解析T的实例 .
我已经阅读了有关Ninject工厂扩展的内容,但是我找不到工厂根据枚举解析特定类的任何示例 .
每个类派生自一个基类,派生类有几个不同的接口,Ninject也必须解决这些接口 .
例如,界面应如下所示:
public interface IProcessFactory
{
T Create<T>(ProcessIndex processIndex) where T : BaseProcess;
}
怎么能实现这一目标?
2 回答
开箱即用不支持此功能 . 您可以通过编写自己的IInstanceProvider实现来自定义它(另请参见ninject Wiki entry . 然后为您的特定工厂配置它:
或者,如果要更改所有
.ToFactory()
绑定的行为:在加载Ninject.Extensions.Factory
后重新绑定IInstanceProvider
:但是,如果它不是您经常需要的东西,我会考虑手动编写工厂实现@ composition root .
无论如何,在这两种情况下,您都需要知道如何创建条件绑定 . Ninject称之为Contextual Binding . 一种方法是使用Binding-Metadata:
另一种方法是创建自定义IParameter并在条件绑定中使用:
有几个选项可用于使用DI(Ninject)实现AbstractFactory .
在分析了选项之后,我想出了Mark Seemann提供的解决方案,请参阅http://blog.ploeh.dk/2012/03/15/ImplementinganAbstractFactory/
基于容器的工厂解决方案是我选择的解决方案,因为:
性能:按需DI根据请求解析,没有在构造函数中加载实例
易于重构:当我们想要将当前的DI框架(Ninject)替换为具有(几乎或甚至更好)功能集的更好的执行者时,唯一需要改变的地方是工厂内部的调用,而不是NinjectModules / Composition Root中的调用 .
另见SO:Simple Injector:Factory classes that need to create classes with dependencies