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);
最佳实践建议
- 单一职责原则:每个验证器类应该只负责验证一种类型的对象
- 可重用性:将常用的验证逻辑提取为扩展方法或自定义验证器
- 明确性:为每个验证规则提供清晰的错误消息
- 性能考虑:验证器实例通常是轻量级的,可以频繁创建
- 测试覆盖:为所有验证规则编写单元测试
通过FluentValidation,开发者可以创建结构清晰、易于维护的验证逻辑,大大提高应用程序的数据完整性和用户体验。
FluentValidation 项目地址: https://gitcode.com/gh_mirrors/flu/FluentValidation
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考