You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 11:45:29