【问题标题】:How to bind IDictionary property with Ninject?如何将 IDictionary 属性与 Ninject 绑定?
【发布时间】:2011-08-26 11:14:05
【问题描述】:

我有一堂课:

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

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

如何使用 Ninject 绑定这样的属性?

【问题讨论】:

    标签: c# .net dependency-injection ninject


    【解决方案1】:

    我假设这是一个固定列表。最简单的方法是使用提供者:

        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] 将使用提供者创建字典。

    【讨论】:

    • 谢谢,还在学习 Ninject,还不了解提供程序。
    【解决方案2】:

    如果可以从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);
        }
    }
    

    否则 ryber 的解决方案可能是最简单的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-07
      • 1970-01-01
      • 2014-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多