Ninject工厂根据枚举创建T

我想让Ninject根据特定的枚举输入值解析T的实例。

我已经阅读了有关Ninject工厂扩展的内容,但是我找不到工厂根据枚举解析特定类的任何示例。

每个类派生自一个基类,派生类有几个不同的接口,Ninject也必须解决这些接口。

例如,界面应如下所示:

public interface IProcessFactory { T Create(ProcessIndex processIndex) where T : BaseProcess; } 

怎么能实现这一目标?

开箱即用不支持此function。 您可以通过编写自己的IInstanceProvider实现来自定义它(也可以参见ninject Wiki条目 。然后为您的特定工厂配置它:

 kernel.Bind() .ToFactory(() => new MyCustomInstanceProvider()); 

或者,如果要更改所有.ToFactory()绑定的行为:在加载Ninject.Extensions.FactoryNinject.Extensions.Factory绑定Ninject.Extensions.Factory

 kernel.Rebind().To(); 

但是,如果它不是您经常需要的东西,我会考虑手动编写工厂实现@ composition root。

无论如何,在这两种情况下,您都需要知道如何创建条件绑定。 Ninject称之为Contextual Binding 。 一种方法是使用Binding-Metadata:

 const string EnumKey = "EnumKey"; Bind().To() .WithMetadata(EnumKey, MyEnum.A); IResolutionRoot.Get(x => x.Get(EnumKey) == MyEnum.A); 

另一种方法是创建自定义IParameter并在条件绑定中使用:

 Bind().To() .When(x => x.Parameters.OfType().Single().Value == A); 

有几个选项可用于使用DI(Ninject)实现AbstractFactory。

在分析了这些选项之后,我想出了Mark Seemann提供的解决方案,请参阅http://blog.ploeh.dk/2012/03/15/ImplementinganAbstractFactory/

基于容器的工厂解决方案是我选择的解决方案,因为:

  • 性能:按需DI解析请求,构造函数中没有加载实例
  • 易于重构:当我们想要将当前的DI框架(Ninject)替换为具有(几乎或甚至更好)特征集的更好的执行者时,唯一需要改变的地方是工厂内的调用而不是NinjectModules / Composition Root。

另请参见SO: Simple Injector:需要创建具有依赖项的类的Factory类