如何在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
相关产品推荐
相关产品推荐

