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

如何在DryIoc中解析开放泛型接口的所有已注册实现?

问题分析与解决方案

首先,你遇到的问题是DryIoc的ResolveMany(typeof(ICanFetch<,>))无法直接获取所有闭合泛型实现,这并非操作有误,而是DryIoc的默认行为:ResolveMany传入开放泛型类型时,只会查找直接注册为该开放泛型的服务,而你通过[RegisterMany]注册的是各个闭合泛型版本的ICanFetch<,>(比如ICanFetch<Item1, Params1>),容器不会自动将开放泛型与闭合泛型实现关联匹配。

不使用协变的自行实现方案

你可以通过遍历容器的注册信息,筛选出所有基于ICanFetch<,>开放泛型的闭合泛型服务,再逐个解析实例:

// 1. 筛选所有符合条件的注册项
var fetchServiceRegistrations = container.GetServiceRegistrations()
    .Where(registration => 
        registration.ServiceType.IsGenericType &&
        registration.ServiceType.GetGenericTypeDefinition() == typeof(ICanFetch<,>));

// 2. 逐个解析获取实例
var allFetchImplementations = fetchServiceRegistrations
    .Select(registration => container.Resolve(registration.ServiceType))
    .ToList();

补充说明

  • GetServiceRegistrations()会返回容器中所有的注册条目,通过判断服务类型是否为ICanFetch<,>的闭合泛型,就能精准筛选出目标实现。
  • 这种方式不需要修改原接口或实现类,完全基于容器的注册元数据进行查询,避开了协变与Task不兼容的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 02:15:01