导读:本期聚焦于小伙伴创作的《C#怎么使用FluentValidation实现优雅的实体属性校验规则》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C#怎么使用FluentValidation实现优雅的实体属性校验规则》有用,将其分享出去将是对创作者最好的鼓励。

在C#项目开发中,实体属性校验是数据进入业务逻辑前的必要环节,传统的基于特性的校验方式在面对复杂校验逻辑时显得不够灵活,而FluentValidation提供了链式配置的校验方式,让校验规则的定义更清晰、更易维护。

C#怎么使用FluentValidation实现优雅的实体属性校验规则

FluentValidation基础使用步骤

1. 安装依赖包

首先需要通过NuGet安装FluentValidation包,在Visual Studio的包管理器控制台执行以下命令:

Install-Package FluentValidation

2. 定义待校验的实体类

先创建一个简单的用户实体类,包含需要校验的属性:

public class User
{
    public string UserName { get; set; }
    public string Email { get; set; }
    public int Age { get; set; }
    public Address Address { get; set; }
}

public class Address
{
    public string Province { get; set; }
    public string City { get; set; }
}

3. 创建校验器类

校验器类需要继承AbstractValidator<T>泛型类,其中T为待校验的实体类型,在校验器构造函数中定义具体的校验规则:

using FluentValidation;

public class UserValidator : AbstractValidator<User>
{
    public UserValidator()
    {
        // 用户名校验:非空,长度2-20位
        RuleFor(user => user.UserName)
            .NotEmpty().WithMessage("用户名不能为空")
            .Length(2, 20).WithMessage("用户名长度必须在2到20位之间");

        // 邮箱校验:非空,符合邮箱格式
        RuleFor(user => user.Email)
            .NotEmpty().WithMessage("邮箱不能为空")
            .EmailAddress().WithMessage("邮箱格式不正确");

        // 年龄校验:大于等于18,小于等于60
        RuleFor(user => user.Age)
            .InclusiveBetween(18, 60).WithMessage("年龄必须在18到60岁之间");
    }
}

4. 执行校验逻辑

创建实体实例后,实例化校验器并调用Validate方法即可完成校验,校验结果包含是否通过、错误信息等内容:

class Program
{
    static void Main(string[] args)
    {
        var user = new User
        {
            UserName = "张三",
            Email = "zhangsan@ippipp.com",
            Age = 25
        };

        var validator = new UserValidator();
        var validationResult = validator.Validate(user);

        if (validationResult.IsValid)
        {
            Console.WriteLine("实体校验通过");
        }
        else
        {
            foreach (var error in validationResult.Errors)
            {
                Console.WriteLine($"属性{error.PropertyName}校验失败:{error.ErrorMessage}");
            }
        }
    }
}

进阶校验场景

自定义校验逻辑

当内置的校验规则无法满足需求时,可以使用Must方法自定义校验逻辑:

public class UserValidator : AbstractValidator<User>
{
    public UserValidator()
    {
        // 自定义校验:用户名不能包含特殊字符
        RuleFor(user => user.UserName)
            .Must(userName => !userName.Any(c => !char.IsLetterOrDigit(c)))
            .WithMessage("用户名不能包含特殊字符");
    }
}

嵌套实体校验

如果实体包含子实体属性,可以通过SetValidator方法关联子实体的校验器:

public class AddressValidator : AbstractValidator<Address>
{
    public AddressValidator()
    {
        RuleFor(addr => addr.Province).NotEmpty().WithMessage("省份不能为空");
        RuleFor(addr => addr.City).NotEmpty().WithMessage("城市不能为空");
    }
}

public class UserValidator : AbstractValidator<User>
{
    public UserValidator()
    {
        // 关联地址校验器
        RuleFor(user => user.Address).SetValidator(new AddressValidator());
    }
}

条件校验

可以使用When方法设置校验规则生效的条件:

public class UserValidator : AbstractValidator<User>
{
    public UserValidator()
    {
        // 当年龄大于等于18时,才校验邮箱必填
        RuleFor(user => user.Email)
            .NotEmpty().WithMessage("成年用户邮箱不能为空")
            .When(user => user.Age >= 18);
    }
}

校验规则复用

如果有多个实体需要相同的校验规则,可以定义通用的校验规则扩展方法:

public static class ValidatorExtensions
{
    public static IRuleBuilderOptions<T, string> PhoneNumberRule<T>(this IRuleBuilder<T, string> ruleBuilder)
    {
        return ruleBuilder
            .NotEmpty().WithMessage("手机号不能为空")
            .Matches(@"^1[3-9]d{9}$").WithMessage("手机号格式不正确");
    }
}

public class UserValidator : AbstractValidator<User>
{
    public UserValidator()
    {
        // 复用手机号校验规则
        RuleFor(user => user.PhoneNumber).PhoneNumberRule();
    }
}

常见内置校验规则汇总

以下是FluentValidation常用的内置校验规则说明:

规则方法作用说明
NotEmpty()校验属性值不能为空(字符串非空、集合非空、值类型非默认值)
NotNull()校验属性值不能为null
Length(min, max)校验字符串长度在指定区间
EmailAddress()校验字符串符合邮箱格式
InclusiveBetween(min, max)校验数值在指定闭区间内
Matches(regex)校验字符串符合指定正则表达式
GreaterThan(value)校验数值大于指定值
LessThan(value)校验数值小于指定值

C#FluentValidation实体属性校验校验规则修改时间:2026-07-22 10:18:31

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。