注册多个键控或命名服务

时间:2013-07-14 15:59:50

标签: c# autofac

我需要注册多个服务,这些服务具有相同的接口但不同于任何字符串约束。更具体一点:

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

这很完美但我需要在相同的名称或密钥上注册多个服务,并且能够解决所有这些问题。

1 个答案:

答案 0 :(得分:2)

使用

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

请参阅Relationship Types以供参考。