簡體   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