2011-08-26 15 views
4

Ninject와 IDictionary 속성을 바인딩하는 방법?

클래스가 있습니다.

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

고유 한 종속성이 주입 된 IMyInterface 인터페이스의 여러 구현이 있습니다. 각 구현에는 다른 키가 있어야합니다.

Ninject를 사용하여 이러한 속성을 바인딩하는 방법은 무엇입니까?

답변

4

나는 이것이 고정리스트라고 가정합니다. 사전을 만들기 위해 공급자를 사용합니다

kernel.Bind<IDictionary<string, IMyInterface>>().ToProvider<MyProvider>(); 

다음 속성에 대한 [주입한다] : 당신이 좋아하는 커널에 공급자를 등록 할 수 있습니다

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

: 가장 쉬운 방법은 공급자와 것 .

+0

Ninject를 배우고 아직 제공자에 대해 알지 못해 주셔서 감사합니다. –

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

그렇지 않으면 ryber의 해결책이 아마도 가장 쉬운 방법 일 것입니다.

관련 문제