FluentValidation入门指南:创建第一个验证器

FluentValidation入门指南:创建第一个验证器

FluentValidation FluentValidation 项目地址: https://gitcode.com/gh_mirrors/flu/FluentValidation

什么是FluentValidation

FluentValidation是一个流行的.NET验证库,它采用流畅接口(Fluent Interface)设计模式,使验证规则的编写更加直观和可读。相比传统的属性注解验证方式,FluentValidation提供了更强大、更灵活的验证能力。

创建第一个验证器

1. 定义模型类

首先,我们需要定义一个要验证的模型类。例如,我们有一个客户(Customer)类:

public class Customer 
{
    public int Id { get; set; }
    public string Surname { get; set; }
    public string Forename { get; set; }
    public decimal Discount { get; set; }
    public string Address { get; set; }
}

2. 创建验证器类

要为Customer类创建验证器,我们需要继承AbstractValidator<T>泛型类:

using FluentValidation;

public class CustomerValidator : AbstractValidator<Customer> 
{
    public CustomerValidator()
    {
        // 验证规则将在这里定义
    }
}

3. 添加基本验证规则

在验证器的构造函数中,我们可以使用RuleFor方法定义验证规则。例如,确保Surname不为空:

public CustomerValidator()
{
    RuleFor(customer => customer.Surname).NotNull();
}

4. 执行验证

创建验证器实例并验证对象:

Customer customer = new Customer();
CustomerValidator validator = new CustomerValidator();

ValidationResult result = validator.Validate(customer);

5. 处理验证结果

ValidationResult包含两个重要属性:

  • IsValid:布尔值,表示验证是否通过
  • Errors:包含所有验证失败的详细信息集合

处理验证结果的示例代码:

if(!result.IsValid) 
{
    foreach(var failure in result.Errors)
    {
        Console.WriteLine($"属性 {failure.PropertyName} 验证失败。错误信息: {failure.ErrorMessage}");
    }
}

也可以将所有错误信息合并为一个字符串:

string allMessages = result.ToString(); // 默认用换行符分隔
string customSeparated = result.ToString("|"); // 自定义分隔符

高级验证技巧

链式验证

可以在同一个属性上链式调用多个验证器:

RuleFor(customer => customer.Surname)
    .NotNull()
    .NotEqual("foo")
    .Length(2, 50);

抛出验证异常

除了返回验证结果,还可以让验证失败时直接抛出异常:

validator.ValidateAndThrow(customer);

这会抛出ValidationException异常,其中包含错误信息。

复杂对象验证

对于嵌套的复杂对象,可以创建独立的验证器并重用:

public class AddressValidator : AbstractValidator<Address> 
{
    public AddressValidator()
    {
        RuleFor(address => address.Postcode).NotNull();
    }
}

public class CustomerValidator : AbstractValidator<Customer> 
{
    public CustomerValidator()
    {
        RuleFor(customer => customer.Address).SetValidator(new AddressValidator());
    }
}

或者直接内联验证嵌套属性:

RuleFor(customer => customer.Address.Postcode).NotNull()
    .When(customer => customer.Address != null);

最佳实践建议

  1. 单一职责原则:每个验证器类应该只负责验证一种类型的对象
  2. 可重用性:将常用的验证逻辑提取为扩展方法或自定义验证器
  3. 明确性:为每个验证规则提供清晰的错误消息
  4. 性能考虑:验证器实例通常是轻量级的,可以频繁创建
  5. 测试覆盖:为所有验证规则编写单元测试

通过FluentValidation,开发者可以创建结构清晰、易于维护的验证逻辑,大大提高应用程序的数据完整性和用户体验。

FluentValidation FluentValidation 项目地址: https://gitcode.com/gh_mirrors/flu/FluentValidation

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奚书芹Half-Dane

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

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

抵扣说明:

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

余额充值