如何将IDictionary属性绑定到Ninject?

时间:2011-08-26 11:14:06

标签: c# .net dependency-injection ninject

我有一个班级:

public class MyClass
{
    [Inject]
    public IDictionary<string, IMyInterface> MyDictionary { get; set; }
}

我有几个IMyInterface接口的实现,它们注入了自己的依赖项。每个实现都应该有不同的密钥。

如何使用Ninject绑定此类属性?

2 个答案:

答案 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);
    }
}

否则,莱伯的解决方案可能是最简单的方法。