2014-01-25 32 views
2

我已經註冊了許多類型,實現IEventListener<T>接口。獲取使用類型變量與Autofac實現通用接口的所有類型

如何解決實現IEventListener<T>的所有類型,但僅使用Type變量?

例如我有事件SomethingHappened和實現IEventListener<SomethingHappened>接口的兩種類型。

我通過一些EventBus發送事件,並將其作爲Object類的實例接收。如何僅使用GetType()方法的結果來解析所有偵聽器(實現IEventListener<SomethingHappened>接口的類型)?

回答

0

有一對夫婦的方式做到這一點:

  1. 解析由接口聽衆。
    可以定義你從它的一般定義所需要的接口:

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

    然後你就可以讓你從任何你想要的需要實施,從lifetimescope例如。

  2. 註冊通過聽他們的類型,鍵控或例如沿革資料註冊事件偵聽

    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); 
    
相關問題