注册多个键控或命名服务
本文关键字:服务 注册 | 更新日期: 2023-09-27 18:22:20
我需要注册多个服务,这些服务具有相同的接口,但因任何字符串约束而不同。更加具体:
[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();
}
}
和解析函数:
builder.Register<Func<string, IEnumerable<IEventReceiver>>>(c =>
{
var ctx = c.Resolve<IComponentContext>();
return eventName =>
{
var eventReceiver = ctx.ResolveKeyed<IEventReceiver>(eventName);
return new [] { eventReceiver };
};
});
这非常有效,但我需要在同一名称或密钥上注册多个服务,并能够解决所有问题。
使用
ctx.ResolveKeyed<IEnumerable<IEventReceiver>>(eventName)
请参见关系类型以供参考。