2013-07-14 2 views
0

동일한 인터페이스이지만 문자열 제약 조건에 따라 다른 여러 서비스를 등록해야합니다.다중 키 또는 명명 된 서비스 등록

[EventName("Domain/Task/Actions/Save")] 
public class EntitySavedEventReceiver1 : IEventReceiver 
{ 
    public void Receive(RemoteEvent evnt) 
    { 
    } 
} 

[EventName("Domain/Task/Actions/Save")] 
public class EntitySavedEventReceiver2 : IEventReceiver 
{ 
    public void Receive(RemoteEvent evnt) 
    { 
    } 
} 

내가 노력 등록 : 더 구체적으로

foreach (Type eventReceiverType in mainAssembly.GetTypes().Where(x => typeof (IEventReceiver).IsAssignableFrom(x))) 
{ 
    var attributes = eventReceiverType.GetCustomAttributes(typeof (EventNameAttribute), false); 

    foreach (var attribute in attributes.Cast<EventNameAttribute>()) 
    { 
     builder.RegisterType(eventReceiverType) 
      .Keyed<IEventReceiver>(attribute.EventName) 
      // tried also named 
      .AsImplementedInterfaces(); 
    } 
} 

및 해결 FUNC :

builder.Register<Func<string, IEnumerable<IEventReceiver>>>(c => 
    { 
     var ctx = c.Resolve<IComponentContext>(); 
     return eventName => 
      { 
       var eventReceiver = ctx.ResolveKeyed<IEventReceiver>(eventName); 
       return new [] { eventReceiver }; 
      }; 
    }); 

이 완벽하게 작동하지만 같은 이름에 여러 서비스를 등록해야하거나 키를 모두 해결할 수있는 능력이 있어야합니다.

+0

나는 꽤 확신한다. ResolveKeyed > (name)'가 효과적이다. –

+0

젠장 .. 너무 쉬워. 고맙습니다! –

+2

@ default.kramer 너의 대답은 대답이 아니라 주석이어야한다. – onof

답변

2

사용

ctx.ResolveKeyed<IEnumerable<IEventReceiver>>(eventName) 

은 참조 Relationship Types 참조하십시오.

관련 문제