FluentValidation 终极指南:从简单规则到复杂业务逻辑的自定义验证器开发

FluentValidation 终极指南:从简单规则到复杂业务逻辑的自定义验证器开发

【免费下载链接】FluentValidation 【免费下载链接】FluentValidation 项目地址: https://gitcode.com/gh_mirrors/flu/FluentValidation

FluentValidation 是一个功能强大的 .NET 验证库,它提供了一种流畅的接口来构建强类型的验证规则。无论你是初学者还是经验丰富的开发者,掌握自定义验证器的开发技巧都能让你的应用程序更加健壮和可维护。本文将带你深入了解如何从简单规则逐步构建复杂的业务逻辑验证器。

🎯 为什么需要自定义验证器?

在实际开发中,内置验证器往往无法满足所有业务需求。比如你需要验证:

  • 订单金额是否超过用户信用额度
  • 库存数量是否满足订单需求
  • 用户年龄是否符合特定业务规则

这些复杂的业务逻辑验证正是自定义验证器大显身手的地方!

🚀 简单规则:使用 Must 方法快速上手

FluentValidation 简单规则示例

最简单的自定义验证器开发方法就是使用 Must 方法。假设我们需要验证用户的宠物列表不能超过10只:

RuleFor(x => x.Pets).Must(list => list.Count < 10)
  .WithMessage("宠物列表不能超过10只");

这种方法非常适合快速实现简单的验证逻辑,代码简洁易懂。

🔧 进阶技巧:创建可重用的扩展方法

为了让自定义验证器更加优雅和可重用,我们可以将其封装成扩展方法:

public static class MyCustomValidators {
  public static IRuleBuilderOptions<T, IList<TElement>> ListMustContainFewerThan<T, TElement>(
    this IRuleBuilder<T, IList<TElement>> ruleBuilder, int num) {
    
    return ruleBuilder.Must(list => list.Count < num)
      .WithMessage("列表包含过多项目");
  }
}

使用方式变得极其简单:

RuleFor(x => x.Pets).ListMustContainFewerThan(10);

💡 智能错误消息:使用自定义占位符

FluentValidation 错误消息优化

为了让错误信息更加友好和详细,我们可以使用消息格式化器:

public static IRuleBuilderOptions<T, IList<TElement>> ListMustContainFewerThan<T, TElement>(
  this IRuleBuilder<T, IList<TElement>> ruleBuilder, int num) {

  return ruleBuilder.Must((rootObject, list, context) => {
    context.MessageFormatter
      .AppendArgument("MaxElements", num)
      .AppendArgument("TotalElements", list.Count);
    
    return list.Count < num;
  })
  .WithMessage("{PropertyName} 不能超过 {MaxElements} 个项目。当前包含 {TotalElements} 个");

这样生成的错误消息会是:"Pets 不能超过 10 个项目。当前包含 12 个"

🏗️ 复杂业务逻辑:完整的属性验证器

对于极其复杂的验证逻辑,我们可以创建完整的属性验证器类:

public class ListCountValidator<T, TCollectionElement> : PropertyValidator<T, IList<TCollectionElement>> {
  private int _max;

  public ListCountValidator(int max) {
    _max = max;
  }

  public override bool IsValid(ValidationContext<T> context, IList<TCollectionElement> list) {
    if(list != null && list.Count >= _max) {
      context.MessageFormatter.AppendArgument("MaxElements", _max);
      return false;
    }
    return true;
  }

  protected override string GetDefaultMessageTemplate(string errorCode)
    => "{PropertyName} 不能超过 {MaxElements} 个项目";
}

使用方式:

RuleFor(person => person.Pets).SetValidator(new ListCountValidator<Person, Pet>(10));

📋 快速开发清单

选择合适的验证器类型

  • 简单逻辑:使用 Must 方法
  • 可重用逻辑:创建扩展方法
  • 复杂业务:实现完整属性验证器

优化错误消息

  • 使用内置占位符:{PropertyName}, {PropertyValue}
  • 添加自定义占位符提供详细上下文

遵循最佳实践

  • 保持验证器职责单一
  • 编写单元测试确保正确性
  • 提供清晰的文档说明

🎉 总结

通过本文的学习,你已经掌握了 FluentValidation 自定义验证器开发的完整路径。从简单的 Must 方法到复杂的属性验证器实现,每种方法都有其适用场景。

记住:从简单开始,逐步复杂。大多数情况下,Must 方法和扩展方法已经足够满足需求。只有在处理极其复杂的业务逻辑时,才需要考虑完整的属性验证器实现。

开始动手实践吧,让你的验证逻辑更加优雅和强大!✨

【免费下载链接】FluentValidation 【免费下载链接】FluentValidation 项目地址: https://gitcode.com/gh_mirrors/flu/FluentValidation

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值