2013-07-14 4 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 yours должен быть ответом, а не комментарием – onof

ответ

2

Использование

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

См Relationship Types для справки.

Смежные вопросы