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

