我想让Ninject根据特定的枚举输入值解析T的实例。
我已经阅读了Ninject的工厂扩展,但我找不到工厂根据枚举解析特定类的任何示例。
每个类派生自一个基类,派生类有几个不同的接口,Ninject也必须解析它们。
例如,界面应如下所示:
public interface IProcessFactory
{
T Create<T>(ProcessIndex processIndex) where T : BaseProcess;
}
如何实现这一目标?
答案 0 :(得分:3)
不支持开箱即用。您可以通过编写自己的IInstanceProvider实现来自定义它(另请参阅ninject Wiki entry。然后为您的特定工厂配置它:
kernel.Bind<IFooFactory>()
.ToFactory(() => new MyCustomInstanceProvider());
或者,如果您想更改所有.ToFactory()
绑定的行为,请执行以下操作:加载IInstanceProvider
后重新绑定Ninject.Extensions.Factory
:
kernel.Rebind<IInstanceProvider>().To<MyCustomInstanceProvider>();
但是,如果不是你经常需要的东西,我会考虑手工编写工厂实现@ composition root。
无论如何,在这两种情况下,您都需要知道如何创建条件绑定。 Ninject称之为Contextual Binding。 一种方法是使用Binding-Metadata:
const string EnumKey = "EnumKey";
Bind<IFoo>().To<AFoo>()
.WithMetadata(EnumKey, MyEnum.A);
IResolutionRoot.Get<IFoo>(x => x.Get<MyEnum>(EnumKey) == MyEnum.A);
另一种方法是创建自定义IParameter并在条件绑定中使用:
Bind<IFoo>().To<AFoo>()
.When(x => x.Parameters.OfType<MyParameter>().Single().Value == A);
答案 1 :(得分:0)
有几个选项可用于使用DI(Ninject)实现AbstractFactory。
在分析了选项后,我想出了Mark Seemann提供的解决方案,请参阅http://blog.ploeh.dk/2012/03/15/ImplementinganAbstractFactory/
基于容器的工厂解决方案是我选择的解决方案,因为:
另见SO: Simple Injector:Factory classes that need to create classes with dependencies