在C#项目开发中,业务数据的合法性校验是必不可少的工作,传统的验证方式往往将数据注解特性直接写在实体类上,耦合性较高且规则扩展不够灵活。FluentValidation作为一款轻量级的验证库,采用分离式的验证器设计,让验证规则的定义更加清晰易维护。
FluentValidation基础概念
FluentValidation的核心思想是创建一个独立的验证器类,专门负责某一类实体的验证规则,每个验证器继承自AbstractValidator<T>,其中T是需要验证的实体类型。这种设计与实体类本身解耦,后续修改验证规则时不需要改动实体类的代码。
环境准备
首先需要在项目中安装FluentValidation的NuGet包,可以通过包管理器控制台执行以下命令:
// 安装FluentValidation包 Install-Package FluentValidation
如果是.NET Core项目,也可以安装对应的依赖注入扩展包,方便后续在项目中注入验证器:
// 安装依赖注入扩展包 Install-Package FluentValidation.DependencyInjectionExtensions
创建验证器
假设我们有一个用户注册的实体类,包含用户名、邮箱、年龄三个属性:
public class UserRegisterDto
{
public string UserName { get; set; }
public string Email { get; set; }
public int Age { get; set; }
}
接下来为这个实体创建对应的验证器,继承AbstractValidator<UserRegisterDto>,在构造方法中定义验证规则:
using FluentValidation;
public class UserRegisterDtoValidator : AbstractValidator<UserRegisterDto>
{
public UserRegisterDtoValidator()
{
// 用户名验证规则:非空,长度在3到20之间
RuleFor(x => x.UserName)
.NotEmpty().WithMessage("用户名不能为空")
.Length(3, 20).WithMessage("用户名长度需要在3到20个字符之间");
// 邮箱验证规则:非空,符合邮箱格式
RuleFor(x => x.Email)
.NotEmpty().WithMessage("邮箱不能为空")
.EmailAddress().WithMessage("请输入合法的邮箱地址");
// 年龄验证规则:大于0,小于120
RuleFor(x => x.Age)
.GreaterThan(0).WithMessage("年龄必须大于0")
.LessThan(120).WithMessage("年龄必须小于120");
}
}
常用验证规则说明
FluentValidation提供了丰富的内置验证规则,以下是开发中常用的几类:
- 非空验证:使用
NotEmpty()方法,校验字符串、集合、对象等不为空 - 长度验证:使用
Length(min, max)方法,校验字符串的长度范围 - 数值范围验证:使用
GreaterThan()、LessThan()、InclusiveBetween()等方法,校验数值的合法范围 - 格式验证:使用
EmailAddress()、Matches(regex)等方法,校验字符串是否符合指定格式 - 自定义验证:使用
Must(predicate)方法,传入自定义的判断逻辑
触发验证
定义好验证器之后,就可以在业务代码中创建验证器实例并触发验证:
var user = new UserRegisterDto
{
UserName = "ab",
Email = "test@ippipp.com",
Age = 150
};
var validator = new UserRegisterDtoValidator();
var validationResult = validator.Validate(user);
if (!validationResult.IsValid)
{
// 输出所有验证失败的信息
foreach (var error in validationResult.Errors)
{
Console.WriteLine($"属性 {error.PropertyName} 验证失败:{error.ErrorMessage}");
}
}
else
{
Console.WriteLine("数据验证通过");
}
如果是使用依赖注入的项目,可以先在服务配置中注册验证器:
// 在Program.cs或者Startup.cs中注册验证器 builder.Services.AddValidatorsFromAssemblyContaining<UserRegisterDtoValidator>();
之后在需要使用的类中通过构造函数注入验证器即可:
public class UserService
{
private readonly UserRegisterDtoValidator _validator;
public UserService(UserRegisterDtoValidator validator)
{
_validator = validator;
}
public void RegisterUser(UserRegisterDto dto)
{
var result = _validator.Validate(dto);
if (!result.IsValid)
{
throw new ArgumentException(string.Join(",", result.Errors.Select(e => e.ErrorMessage)));
}
// 执行注册逻辑
}
}
注意事项
在使用FluentValidation时需要注意,验证规则的配置顺序不影响验证逻辑的执行,所有规则都会被执行。如果需要某个规则失败后就停止后续规则校验,可以在规则后添加StopOnFirstFailure()方法。另外,验证器的实例是线程安全的,在依赖注入场景下可以注册为单例模式,减少对象创建的开销。
FluentValidationC#数据验证验证规则修改时间:2026-06-19 14:27:33