繁体   English   中英

使用带有Autofac的Type变量获取实现通用接口的所有类型

[英]Get all types implementing generic interface using Type variable with Autofac

我已经注册了许多实现IEventListener<T>接口的类型。

如何解析实现IEventListener<T>但仅使用Type变量的所有类型?

例如,我有事件SomethingHappened和两个实现IEventListener<SomethingHappened>接口的类型。

我正在通过一些EventBus发送事件,并将其作为Object类的实例接收。 如何仅使用GetType()方法的结果来解析所有侦听器(实现IEventListener<SomethingHappened>接口的类型GetType()

有几种方法可以做到:

  1. 通过接口解析侦听器。
    您可以从其通用定义中定义所需的接口:

     var eventType = @event.GetType(); // suppose it's SomethingHappened type var eventListenerType = typeof(IEventListener<>).MakeGenericType(eventType); // eventListenerType is IEventListener<SomethingHappened> 

    然后,您可以从lifetimescope中获取所需的实现,例如lifetimescope。

  2. 按照他们监听的类型注册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); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM