【问题标题】:Get all types implementing generic interface using Type variable with Autofac使用带有 Autofac 的 Type 变量获取所有实现泛型接口的类型
【发布时间】:2014-01-25 22:45:47
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# autofac


    【解决方案1】:

    有几种方法可以做到:

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

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

      然后你可以从任何你想要的地方得到你需要的实现,例如从lifetimescope。

    2. 通过监听的类型注册 EventListener,例如 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);
      

    【讨论】:

      猜你喜欢
      • 2014-07-31
      • 2010-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-22
      • 1970-01-01
      相关资源
      最近更新 更多