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. 执行验证
创建验证器实例并调用Validate
方法来验证对象:
Customer customer = new Customer();
CustomerValidator validator = new CustomerValidator();
ValidationResult result = validator.Validate(customer);
5. 处理验证结果
Validate
方法返回一个ValidationResult
对象,包含两个重要属性:
IsValid
:布尔值,表示验证是否通过Errors
:包含所有验证失败的详细信息集合
处理验证结果的示例代码:
if(!result.IsValid)
{
foreach(var failure in result.Errors)
{
Console.WriteLine($"属性 {failure.PropertyName} 验证失败。错误信息: {failure.ErrorMessage}");
}
}
进阶验证技巧
链式验证
FluentValidation支持链式调用,可以在一个属性上定义多个验证规则:
RuleFor(customer => customer.Surname)
.NotNull()
.NotEqual("foo")
.Length(2, 50);
验证异常处理
除了手动检查ValidationResult
,还可以让验证失败时自动抛出异常:
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.Name).NotNull();
RuleFor(customer => customer.Address).SetValidator(new AddressValidator());
}
}
或者使用内联验证:
RuleFor(customer => customer.Address.Postcode)
.NotNull()
.When(customer => customer.Address != null);
最佳实践建议
- 单一职责原则:每个验证器应该只负责验证一个特定类的规则
- 可重用性:对于复杂属性,创建独立的验证器以便重用
- 明确性:为每个验证规则提供清晰的错误信息
- 性能考虑:避免在验证器中执行复杂的数据库查询或耗时操作
- 测试覆盖:验证逻辑应该被充分测试,确保各种边界条件都被覆盖
通过FluentValidation,开发者可以创建清晰、可维护且功能强大的验证逻辑,大大提升应用程序的数据完整性和用户体验。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考