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

Autofac如何根据运行时提供的Type解析所有已注册实例

Autofac 非泛型解析指定类型所有已注册实例方案

Autofac 原生支持该需求,完全可以实现你期望的非泛型调用效果。

标准实现:非泛型版 ResolveMany

你提到的container.ResolveMany(type)调用形式是Autofac内置支持的,该方法属于核心扩展方法,只要引入Autofac命名空间即可直接调用,示例:

var type = typeof(IMyType);
// 解析该类型下所有已注册实例,返回IEnumerable<object>
var allInstances = container.ResolveMany(type);

注意事项

  • 非泛型重载的返回值是IEnumerable<object>,动态场景下可直接遍历处理,如果后续能确定强类型,用LINQ的Cast<T>()转换即可。
  • 需要传入解析构造参数时,直接在type参数后追加对应Parameter实例即可,和泛型版ResolveMany<T>()的参数规则一致。
  • 返回实例的排列顺序和类型在容器中的注册顺序一致。

低版本兼容写法

如果使用的Autofac版本较旧,找不到非泛型版ResolveMany重载,可以通过构造闭合泛型类型的方式,用基础非泛型Resolve实现,效果完全等价:

var type = typeof(IMyType);
// 构造对应服务类型的IEnumerable<>闭合泛型
var enumerableType = typeof(IEnumerable<>).MakeGenericType(type);
// 解析得到所有注册实例
var allInstances = (IEnumerable<object>)container.Resolve(enumerableType);

Autofac默认支持解析服务类型的可枚举集合,逻辑和泛型场景下注入IEnumerable<T>获取所有实例的逻辑完全一致:对应类型无注册时返回空集合,不会抛出服务未注册的异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 15:33:14