什么是 FluentValidation,为什么需要它?
FluentValidation 是一个流行的 .NET 库,用于构建严格且可读的业务对象验证规则。与内置的验证属性(Data Annotations)不同,FluentValidation 提供了一种基于分离验证逻辑和数据模型的方法。这使得代码更清晰、更易测试、更灵活。
该库使用“流畅接口”(Fluent Interface),允许通过点符号构建验证规则链。FluentValidation 支持复杂场景:级联验证、条件规则、自定义验证器、列表和嵌套对象的处理。
为什么需要 FluentValidation?
- 职责分离:验证规则不会污染数据模型。
- 可读性:规则链易于阅读和维护。
- 灵活性:轻松创建复杂、条件和组合规则。
- 可测试性:验证器可以像普通类一样进行测试。
- 集成:与 ASP.NET Core、MVC、Web API 和其他框架完美集成。
安装 FluentValidation
通过 NuGet 包管理器安装该库。在包管理器控制台或 .NET CLI 终端中执行以下任一命令:
// 通过 Package Manager Console 安装Install-Package FluentValidation
// 通过 .NET CLI 安装dotnet add package FluentValidation要与 ASP.NET Core 集成,还需要以下包:
dotnet add package FluentValidation.AspNetCore快速入门:代码示例
假设我们有一个用户模型:
public class User{ public int Id { get; set; } public string Name { get; set; } public string Email { get; set; } public int Age { get; set; } public string Password { get; set; } public string ConfirmPassword { get; set; }}创建一个验证器,继承自 AbstractValidator<User>:
using FluentValidation;
public class UserValidator : AbstractValidator<User>{ public UserValidator() { RuleFor(user => user.Name) .NotEmpty().WithMessage("姓名为必填项") .Length(2, 50).WithMessage("姓名长度应在 2 到 50 个字符之间");
RuleFor(user => user.Email) .NotEmpty().WithMessage("电子邮件为必填项") .EmailAddress().WithMessage("电子邮件格式不正确");
RuleFor(user => user.Age) .InclusiveBetween(18, 120).WithMessage("年龄应在 18 到 120 岁之间");
RuleFor(user => user.Password) .NotEmpty().WithMessage("密码为必填项") .MinimumLength(6).WithMessage("密码至少需要 6 个字符");
RuleFor(user => user.ConfirmPassword) .Equal(user => user.Password).WithMessage("密码不匹配"); }}使用验证器:
var validator = new UserValidator();var user = new User{ Name = "A", Email = "invalid-email", Age = 15, Password = "123", ConfirmPassword = "456"};
var result = validator.Validate(user);
if (!result.IsValid){ foreach (var error in result.Errors) { Console.WriteLine($"属性: {error.PropertyName}, 错误: {error.ErrorMessage}"); }}FluentValidation 的主要方法
以下是该库的关键方法,包含详细说明和示例。
1. RuleFor()
功能:为对象的特定属性定义验证规则。这是开始验证的主要方法。