Autofac键控服务调用ResolveKeyed解析时报找不到生命周期作用域错误如何解决
Autofac 解析报错问题解决方法
核心报错原因
你注册服务时使用了InstancePerRequest()生命周期配置,该配置仅适配带有HTTP请求上下文的Web应用,控制台应用不存在内置的请求生命周期作用域,因此解析时无法找到匹配的作用域触发报错。
具体解决步骤
- 第一步:替换生命周期配置
将所有服务注册代码中的InstancePerRequest()替换为适配控制台应用的生命周期策略:- 若需要每个自定义生命周期作用域内仅生成一个实例,替换为
InstancePerLifetimeScope() - 若需要全局单例,替换为
SingleInstance() - 若需要每次解析都生成新实例,替换为
InstancePerDependency()
- 若需要每个自定义生命周期作用域内仅生成一个实例,替换为
修改后的注册代码示例:
builder.RegisterType<ILTLoPublisher<ScheduleUpdateEvent>>() .AsImplementedInterfaces() .InstancePerLifetimeScope() .Keyed<IILTLoPublisher<ScheduleUpdateEvent>>(AuditType.Schedule); builder.RegisterType<ILTLoPublisher<ScheduleUpdatePart>>() .AsImplementedInterfaces() .InstancePerLifetimeScope() .Keyed<IILTLoPublisher<ScheduleUpdatePart>>(AuditType.Part); builder.RegisterType<ILTLoPublisher<ScheduleUpdateTest>>() .AsImplementedInterfaces() .InstancePerLifetimeScope() .Keyed<IILTLoPublisher<ScheduleUpdateTest>>(AuditType.Test);
- 第二步:校验注册类型合法性
确认RegisterType中传入的是具体实现类而非接口:若ILTLoPublisher<>本身是接口,此处会出现注册错误,需要替换为对应的实现类,示例如下:
// 假设实现类为ILTLoPublisherImpl<> builder.RegisterType<ILTLoPublisherImpl<ScheduleUpdateEvent>>() .AsImplementedInterfaces() .InstancePerLifetimeScope() .Keyed<IILTLoPublisher<ScheduleUpdateEvent>>(AuditType.Schedule);
- 第三步:验证解析逻辑
修改完成后原有解析代码无需调整,通过BeginLifetimeScope()创建的自定义作用域可直接匹配InstancePerLifetimeScope()的生命周期配置,正常解析出目标服务。
内容的提问来源于stack exchange,提问作者abhijit rajan
相关产品推荐
相关产品推荐

