SuperAPI AI 工具集

fluentvalidation-patterns

编程与开发

查看项目

更新于 10-16 03:19

技能介绍

用途

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} 等占位符,实际使用时需替换为具体名称。