.NET Core 6.0项目FluentValidation注册及DI扫描相关疑问
.NET Core 6.0项目中FluentValidation、DI扫描与服务注册疑问解答
1. 未调用AddValidatorsFromAssembly时,FluentValidation验证器如何注册?
这段DI扫描代码会自动完成验证器的注册。只要你的验证器类继承了AbstractValidator<T>(它实现了IValidator<T>接口),扫描规则里的AsImplementedInterfaces()就会把这些验证器类注册为对应的IValidator<T>接口服务,生命周期为Transient。所以不需要单独调用AddValidatorsFromAssembly,扫描逻辑已经覆盖了验证器的注册需求。
2. 这段DI扫描代码的具体作用
逐行拆解扫描逻辑:
FromAssembliesOf(this.AssemblyMarkerTypes):基于指定的标记类型集合,定位要扫描的目标程序集(通常用项目中的某个类作为标记,避免硬编码程序集名称)AddClasses(false):筛选出程序集中所有非抽象类(参数false表示排除抽象类)UsingRegistrationStrategy(RegistrationStrategy.Append):设置服务注册策略为「追加」——如果某个服务已经存在注册记录,新的注册会添加进去,不会替换原有注册AsImplementedInterfaces():将找到的类注册为它们所实现的所有接口(比如一个类同时实现IValidator<T>和ICustomService,会同时注册这两个接口)WithTransientLifetime():所有通过扫描注册的服务,生命周期都设为Transient(每次请求获取服务时都会创建新实例)
简单来说,这段代码的作用是:自动批量注册指定程序集中所有非抽象类的实现接口,生命周期为Transient,且允许重复注册追加。
3. 既然扫描能注册依赖项,为何还要单独调用AddAutoMapper和AddMediatR?
因为AddAutoMapper和AddMediatR不是单纯的类型注册,它们还会完成框架特有的初始化逻辑,这些是普通DI扫描做不到的:
AddAutoMapper:除了注册IMapper接口,还会扫描程序集中的Profile类,构建映射配置,初始化Mapper实例,处理映射的依赖关系——这些是扫描无法自动完成的,必须通过这个扩展方法触发。AddMediatR:除了注册核心的IMediator服务,还会扫描并注册所有请求处理类(Handler)、管道行为(Behavior),同时配置MediatR内部的DI逻辑(比如Handler的生命周期管理、请求分发机制)。虽然扫描可能会注册部分Handler,但MediatR的核心基础设施必须靠这个方法来初始化。- 另外,代码中先调用
AddMediatR(typeof(Program))初始化核心服务,后续扫描可以补充注册自定义的Handler或扩展组件,两者是互补的关系。
内容的提问来源于stack exchange,提问作者One Developer
相关产品推荐
相关产品推荐

