如何在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
相关产品推荐
相关产品推荐

