我有一个班级:
public class MyClass
{
[Inject]
public IDictionary<string, IMyInterface> MyDictionary { get; set; }
}
我有几个IMyInterface
接口的实现,它们注入了自己的依赖项。每个实现都应该有不同的密钥。
如何使用Ninject绑定此类属性?
答案 0 :(得分:4)
我认为这是一个固定的清单。最简单的方法是提供者:
public class MyProvider : IProvider
{
public object Create(IContext context)
{
return new Dictionary<string, IMyInterface>{
{"alpha", context.Kernel.Get<ImpClassOne>()},
{"beta", context.Kernel.Get<ImplClassTwo>()}
}
}
public Type Type
{
get { return typeof(IDictionary<string, IMyInterface>); }
}
}
您可以将提供商注册到您的内核,如:
kernel.Bind<IDictionary<string, IMyInterface>>().ToProvider<MyProvider>();
然后属性的[Inject]将使用提供程序来创建字典。
答案 1 :(得分:3)
如果可以从IMyInterface
以某种方式检索/生成/计算密钥,例如,从Name属性,然后有一个简单的解决方案。
public class DictionaryProvider : Provider<IDictionary<string, IMyInterface>>
{
private IEmumerable<IMyInterface> instances;
public DictionaryProvider(IEmumerable<IMyInterface> instances>)
{
this.instances = instances;
}
protected override IDictionary<string, IMyInterface> CreateInstance(IContext context)
{
return this.instances.ToDictionary(i => i.Name);
}
}
否则,莱伯的解决方案可能是最简单的方法。