我已经注册了许多实现IEventListener<T>
接口的类型。
如何解析实现IEventListener<T>
但仅使用Type变量的所有类型?
例如,我有事件SomethingHappened和两种实现IEventListener<SomethingHappened>
接口的类型。
我正在通过一些EventBus发送事件,并将其作为Object类的实例接收。如何仅使用IEventListener<SomethingHappened>
方法的结果来解析所有侦听器(实现GetType()
接口的类型)?
答案 0 :(得分:0)
有几种方法可以做到:
按界面解析听众 您可以从其通用定义中定义所需的接口:
var eventType = @event.GetType(); // suppose it's SomethingHappened type
var eventListenerType = typeof(IEventListener<>).MakeGenericType(eventType);
// eventListenerType is IEventListener<SomethingHappened>
然后,您可以从lifetimescope中获得所需的实现。
按照他们收听的类型注册EventListeners,例如Keyed或Metadate注册
public static void RegisterMessageHandlers(this ContainerBuilder builder, params Assembly[] assemblies)
{
foreach (var assembly in assemblies)
{
var eventListeners = assembly.GetTypes().Where(
t => t.IsClass &&
t.GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IEventListener<>)));
foreach (var eventListener in eventListeners)
{
var interfaces = eventListener.GetInterfaces().Where(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IEventListener<>));
foreach (var @interface in interfaces)
{
var eventType = @interface.GetGenericArguments()[0];
builder.RegisterType(eventListener)
.As<IEventListener>()
.WithMetadata<EventListenerMetadata>(c => c.For(m => m.EventType, eventType));
}
}
}
}
然后您可以将所有已注册的事件侦听器注入
IEnumerable<Lazy<IEventListener, EventListenerMetadata>> eventListeners
获取所需的事件监听器
var listOfEventListeners = eventListeners.Where(x => x.Metadata.EventType == eventType);