C# 注册多个键控或命名服务

C# 注册多个键控或命名服务,c#,autofac,C#,Autofac,我需要注册多个服务,这些服务具有相同的接口,但因任何字符串约束而不同。更具体地说: [EventName("Domain/Task/Actions/Save")] public class EntitySavedEventReceiver1 : IEventReceiver { public void Receive(RemoteEvent evnt) { } } [EventName("Domain/Task/Actions/Save")] public class

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

[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();
    }
}
foreach(在mainsassembly.GetTypes()中键入eventReceiverType,其中(x=>typeof(IEventReceiver.IsAssignableFrom(x)))
{
var attributes=eventReceiverType.GetCustomAttributes(typeof(EventNameAttribute),false);
foreach(attributes.Cast()中的var属性)
{
builder.RegisterType(eventReceiverType)
.Keyed(属性.EventName)
//也叫
.a实现接口();
}
}
和解析函数:

builder.Register<Func<string, IEnumerable<IEventReceiver>>>(c =>
    {
        var ctx = c.Resolve<IComponentContext>();
        return eventName =>
            {
                var eventReceiver = ctx.ResolveKeyed<IEventReceiver>(eventName);
                return new [] { eventReceiver };
            };
    });
builder.Register(c=>
{
var ctx=c.Resolve();
returneventname=>
{
var eventReceiver=ctx.resolvedkeyed(eventName);
返回新的[]{eventReceiver};
};
});
这很好,但我需要在同一个名称或密钥上注册多个服务,并能够解决所有问题。

使用

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

请参阅以获取参考。

我非常肯定
解析键(名称)
会起作用。该死。。很容易。谢谢大家!@default.kramer您的答案应该是答案,而不是评论