2011-08-26 62 views
4

我有一個類:如何將IDictionary屬性與Ninject綁定?

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

我有IMyInterface界面的實現具有自己的依賴注入。每個實現應該有不同的關鍵。

如何使用Ninject綁定這樣的屬性?

回答

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>(); 

,然後該屬性的[進樣]將使用提供商創建字典。

+0

謝謝,仍然在學習Ninject,但並不知道提供者。 –

3

如果密鑰可以以某種方式從IMyInterface例如IMyInterface檢索/生成/計算。從名稱屬性,然後有一個簡單的解決方案。

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的解決方案可能是最簡單的方法。