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

3

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

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

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

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

1个回答

0

有几种方法可以做到:

  1. 通过接口解决监听器问题。
    您可以从其通用定义中定义所需的接口:

    var eventType = @event.GetType(); // 假设它是SomethingHappened类型
    var eventListenerType = typeof(IEventListener<>).MakeGenericType(eventType);
    // eventListenerType 是 IEventListener<SomethingHappened>
    

    然后,您可以从任何您想要的地方获取所需的实现,例如从生命周期范围。

  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);
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接