.NET升级后报Cannot resolve scoped service 'FluentValidation.IValidatorFactory'错误
问题根因定位
- 依赖注入生命周期不匹配
Swagger生成器默认是Singleton生命周期,如果你自定义的Swagger Filter(包括OperationFilter、DocumentFilter等)的构造函数中注入了Scoped/Transient生命周期的服务,DI校验时就会抛出该异常,这是.NET Core 3.1+之后DI默认开启生命周期校验触发的典型问题。 - 组件版本不兼容
你之前将私有NuGet依赖改为源码引用,且跨版本升级了.NET框架,但Swashbuckle.AspNetCore、FluentValidation相关的Swagger集成包版本没有和当前目标框架匹配,或是引用的源码组件中自带了Swagger Filter的注册逻辑,依赖的服务没有在主项目的DI容器中注册。 - FluentValidation Swagger集成配置遗漏
你确认了FluentValidation本身配置正确,但如果使用了FluentValidation.AspNetCore.Swagger集成包,需要确保对应Filter依赖的FluentValidation服务已经正确注册,且版本匹配。
解决方案
- 排查Swagger Filter的依赖注入生命周期
找到所有注册的Swagger Filter(代码中AddSwaggerGen方法里AddOperationFilter、AddDocumentFilter等注册的自定义Filter),如果Filter的构造函数注入了Scoped服务,有两种修改方式:- 修改Filter的服务获取逻辑,不从构造函数注入Scoped服务,改为从HttpContext中获取服务:
public void Apply(OpenApiOperation operation, OperationFilterContext context) { // 从请求上下文获取Scoped服务 var scopedService = context.HttpContext.RequestServices.GetRequiredService<你需要的Scoped服务类型>(); } - 临时关闭DI生命周期校验(仅用于验证问题,不建议长期开启):在Program.cs/Startup.cs的AddDefaultServiceProvider配置里设置
ValidateScopes为false:
关闭后如果不再报错,即可确认是生命周期不匹配导致的问题。Host.CreateDefaultBuilder(args) .UseDefaultServiceProvider(options => { options.ValidateScopes = false; })
- 修改Filter的服务获取逻辑,不从构造函数注入Scoped服务,改为从HttpContext中获取服务:
- 统一所有项目的目标框架和依赖版本
确保所有引用的项目(包括直接引用的源码组件)的目标框架统一为同一个版本(推荐统一升级到.NET 6 LTS),所有NuGet包(尤其是Swashbuckle.AspNetCore、FluentValidation、Microsoft.Extensions.*开头的包)的版本保持一致,避免不同项目引用不同版本的同一个包。 - 检查源码组件的服务注册逻辑
查看引用的源码组件中是否有自动注册Swagger Filter的逻辑,确认这些Filter依赖的服务是否已经在主项目的DI容器中完成注册,如有遗漏手动补全注册即可。 - 临时移除Swagger相关配置验证问题
先注释掉AddSwaggerGen、UseSwagger、UseSwaggerUI相关的配置,如果项目可以正常处理HTTP请求,即可确认问题完全出在Swagger相关配置上,再针对性排查即可。
内容的提问来源于stack exchange,提问作者Artur Michajluk
相关产品推荐
相关产品推荐

