用途
FluentValidation Patterns 提供在 ABP Framework 中为输入 DTO 编写验证器的模式集合,主要面向应用层的 Create/Update DTO 验证。适用场景包括:为创建或更新 DTO 创建验证器、实现带仓储检查的异步验证、构建条件验证规则、创建可复用的自定义验证器,以及本地化验证错误消息。
主要能力
基础验证器结构
验证器继承 AbstractValidator<T>,在构造函数中通过 RuleFor 定义规则。示例中为 FirstName、LastName、Email、DateOfBirth 等字段设置 NotEmpty、MaximumLength、EmailAddress、LessThan 等规则,并可用 WithMessage 自定义消息。
ABP 模块注册
在 ApplicationModule 的 PreConfigureServices 中配置 AbpFluentValidationAutoValidationOptions 的 AutoValidateMethodInvocations,并在 ConfigureServices 中通过 AddValidatorsFromAssembly 自动注册程序集内所有验证器。
常用验证规则
- 字符串:NotEmpty、MinimumLength、MaximumLength、Matches(正则)、EmailAddress、Must 自定义判断。
- 数值:InclusiveBetween、GreaterThan、LessThanOrEqualTo、PrecisionScale,可配合 When 条件。
- 日期:LessThan、GreaterThan、字段间比较(如 EndDate 大于 StartDate),可配合 When 判断可空值。
- 集合:NotEmpty、Must 检查数量上限、RuleForEach 配合 ChildRules 逐项验证、Must 检查重复项。
基于仓储的异步验证
通过构造函数注入 IRepository,使用 MustAsync 实现唯一性检查(如邮箱唯一)。更新场景可结合 IHttpContextAccessor 从路由获取实体 ID,在查询中排除当前实体。外键存在性检查同样使用 MustAsync 调用仓储的 AnyAsync。
条件验证
使用 When/Unless 根据字段值决定是否应用规则,例如企业客户才要求 CompanyName 和 TaxId。也可用 When 块按支付方式分组定义多组规则。
自定义验证器
可创建继承 PropertyValidator<T, string> 的同步验证器(如电话号码 E.164 格式),并通过扩展方法暴露为流式调用;也可创建继承 AsyncPropertyValidator<T, string> 的异步验证器(如唯一邮箱),实现 IsValidAsync。
本地化
注入 IStringLocalizer<TResource>,在 WithMessage 中使用本地化键与格式化参数,并在 Localization 的 JSON 文件中定义对应文案。
AppService 中的验证
可手动调用 IValidator.ValidateAsync,失败时抛出 AbpValidationException;也可构造 ValidationContext 并通过 RootContextData 传入 EntityId 等上下文数据,供验证器内部读取。
使用方式
按资料中的代码示例,在 Application/{Feature}/ 下创建 CreateUpdate{Entity}DtoValidator.cs,定义规则后在模块中注册;异步检查通过注入仓储实现;本地化消息通过 IStringLocalizer 与 JSON 资源文件配合。
适用场景
适用于使用 ABP Framework 且需要为输入 DTO 做校验的 .NET 项目,尤其是需要异步数据库校验、条件规则和本地化错误提示的场景。
限制
资料未提供该技能的安装命令、收费方式、支持平台或版本要求,这些信息暂未提供。资料中部分代码使用 {Entity}、{ProjectName} 等占位符,实际使用时需替换为具体名称。