You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Simple Injector容器获取泛型接口的所有注册类型?

获取Simple Injector中所有IHandleMessage的注册类型

要获取容器中所有实现IHandleMessage<T>的注册类型(无需实例化),可以利用Simple Injector的GetRegistrations()方法筛选符合条件的注册项:

// 获取所有注册项并筛选实现IHandleMessage<T>的类型
var handlerTypes = container.GetRegistrations()
    .Where(reg => 
        reg.ServiceType.IsGenericType && 
        reg.ServiceType.GetGenericTypeDefinition() == typeof(IHandleMessage<>))
    .Select(reg => reg.ImplementationType)
    .ToList();
  • GetRegistrations()返回容器中所有已注册的服务项
  • 通过判断服务类型是否为IHandleMessage<>的闭合泛型类型,筛选出目标注册
  • 最后提取ImplementationType即可得到处理器的具体类型
自动将处理器注册到监听端点的优雅方案

要解决手动重复注册的问题,核心思路是基于容器的注册结果自动同步到端点,无需维护静态列表。具体实现步骤如下:

1. 批量注册处理器到容器

首先确保所有IHandleMessage<T>的实现都被注册到Simple Injector,推荐用批量注册方式减少手动操作:

// 批量注册当前程序集中所有IHandleMessage<T>的实现
container.Register(typeof(IHandleMessage<>), Assembly.GetExecutingAssembly());

// 或者指定特定程序集
// container.Register(typeof(IHandleMessage<>), typeof(OrderCreatedHandler).Assembly);

2. 从容器提取处理器并自动注册到端点

在容器配置完成后,利用前面的筛选逻辑获取所有处理器类型,然后自动添加到监听端点:

// 获取所有已注册的处理器类型
var handlerTypes = container.GetRegistrations()
    .Where(reg => 
        reg.ServiceType.IsGenericType && 
        reg.ServiceType.GetGenericTypeDefinition() == typeof(IHandleMessage<>))
    .Select(reg => reg.ImplementationType)
    .ToList();

// 遍历处理器类型,自动注册到端点
foreach (var handlerType in handlerTypes)
{
    // 获取处理器对应的消息类型(即IHandleMessage<T>中的T)
    var messageType = handlerType.GetInterfaces()
        .First(i => 
            i.IsGenericType && 
            i.GetGenericTypeDefinition() == typeof(IHandleMessage<>))
        .GetGenericArguments()[0];
    
    // 调用端点的注册方法(示例,根据实际端点API调整)
    endpointBuilder.AddHandler(messageType, handlerType);
}

这种方式的优势在于:

  • 只需在容器中注册一次处理器,端点注册会自动完成,避免遗漏
  • 完全基于容器的注册状态,确保两者的一致性
  • 无需维护额外的静态列表或配置文件,降低维护成本

内容的提问来源于stack exchange,提问作者Hdecagny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 03:35:19