c# - 使用带有 Autofac 的类型变量获取实现通用接口(interface)的所有类型

标签 c# autofac

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

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

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

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

最佳答案

有几种方法可以做到这一点:

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

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

    然后你可以注入(inject)所有注册的事件监听器作为

    IEnumerable<Lazy<IEventListener, EventListenerMetadata>> eventListeners
    

    并获取你需要的事件监听器

    var listOfEventListeners = eventListeners.Where(x => x.Metadata.EventType == eventType);
    

关于c# - 使用带有 Autofac 的类型变量获取实现通用接口(interface)的所有类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21357229/

相关文章:

c# - 如何在 WinForms 应用程序中取消 PLINQ 查询

c# - 在 Telerik RichText 编辑器中保存和另存为

c# - 将 Autofac 容器传递给 WPF UserControl

c# - Autofac:在泛型方法中解析泛型接口(interface)

c# - ASP.NET MVC 当前对 X 的请求不明确

c# - 将 AddRange 用于新的 List<string>

c# - 检测 winform 中窗口的 X 按钮单击

C# ConcurrentDictionary 如何更新值属性?

inversion-of-control - 从源代码构建 Autofac

asp.net-mvc-3 - Autofac 未填充操作过滤器属性