Autofac无默认值键控注册支持隐式类型注入的方案咨询
Autofac 同时满足键控强制校验与集合注入的实现方案
核心实现逻辑
利用Autofac的两个特性组合实现需求:
- 所有业务实现注册时同时标记
As<T>(),保证可被IEnumerable<T>收集 - 额外注册一个优先级最高的兜底无键实现,设置
ExcludeFromCollections不进入集合,内部直接抛出异常拦截无键请求
完整注册示例
假设你需要注册的服务接口为IService:
// 注册所有键控业务实现 builder.RegisterType<ServiceImplA>() .Keyed<IService>("ServiceA") .As<IService>() .InstancePerLifetimeScope(); builder.RegisterType<ServiceImplB>() .Keyed<IService>("ServiceB") .As<IService>() .InstancePerLifetimeScope(); // 注册兜底拦截逻辑,仅响应无键的IService请求 builder.Register(_ => { throw new InvalidOperationException("禁止无键获取IService实例,请通过键控注册方式获取对应实现"); }) .As<IService>() .ExcludeFromCollections() // 核心配置:该注册项不会被纳入IEnumerable<IService>的解析结果 .SingleInstance();
效果验证
- 无键请求
Resolve<IService>():直接抛出上述自定义异常,满足强制键控获取的需求 - 注入
IEnumerable<IService>:可正常获取到ServiceImplA、ServiceImplB两个实例,无兜底拦截逻辑的实例 - 键控请求
ResolveKeyed<IService>("ServiceA"):可正常获取对应实例,不受影响
内容的提问来源于stack exchange,提问作者chanban
相关产品推荐
相关产品推荐

