You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在FluentValidation中同时配置RootContext附加数据与指定规则集?

可以实现,具体方案如下

1. 手动实例化验证器

直接通过new关键字创建自定义验证器的实例,无需依赖注入容器。

2. 构建ValidationContext并添加附加数据

初始化ValidationContext<T>时传入待验证对象,再通过RootContextData字典添加需要的附加上下文数据。

3. 指定规则集执行验证

调用验证器的Validate方法,传入已配置好的ValidationContext,同时通过ValidateOptions参数指定要运行的规则集。


完整代码示例

假设我们有如下实体类和验证器:

// 待验证实体
public class User {
    public string Name { get; set; }
    public int Age { get; set; }
}

// 自定义验证器(包含多规则集)
public class UserValidator : AbstractValidator<User> {
    public UserValidator() {
        // 默认规则
        RuleFor(x => x.Name).NotEmpty();

        // "Registration"规则集:注册场景验证
        RuleSet("Registration", () => {
            RuleFor(x => x.Age).GreaterThanOrEqualTo(18).WithMessage("注册需年满18岁");
        });

        // "ProfileUpdate"规则集:资料更新场景验证
        RuleSet("ProfileUpdate", () => {
            RuleFor(x => x.Name).MinimumLength(3).WithMessage("用户名长度不能少于3位");
        });
    }
}

核心实现代码:

// 1. 手动创建验证器实例
var validator = new UserValidator();

// 2. 准备待验证对象
var user = new User { Name = "Jo", Age = 17 };

// 3. 创建ValidationContext并附加自定义数据
var validationContext = new ValidationContext<User>(user);
// 添加附加上下文数据
validationContext.RootContextData.Add("CurrentUserId", 123);
validationContext.RootContextData.Add("IsAdmin", false);

// 4. 指定规则集并执行验证
var validationResult = validator.Validate(validationContext, options => {
    // 指定要运行的规则集,可传入多个,比如options.IncludeRuleSets("Registration", "ProfileUpdate")
    options.IncludeRuleSets("Registration");
});

// 处理验证结果
if (!validationResult.IsValid) {
    foreach (var error in validationResult.Errors) {
        Console.WriteLine($"验证失败:{error.ErrorMessage}");
    }
}

规则中访问附加数据

如果需要在验证规则逻辑里使用RootContextData中的附加数据,可通过验证上下文获取:

RuleFor(x => x.Name).Must((user, name, context) => {
    if (context.RootContextData.TryGetValue("IsAdmin", out var isAdminObj) && (bool)isAdminObj) {
        // 管理员用户不受用户名长度限制
        return true;
    }
    return name.Length >= 3;
}).WithMessage("用户名长度不能少于3位(管理员除外)");

内容的提问来源于stack exchange,提问作者cgipson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 09:05:33