FluentValidation升级后ValidationContext<T>设置Severity方法
FluentValidation 8.6.2升级11.1.0 自定义验证器Severity适配方案
- 旧版本代码失效原因:FluentValidation从9.x版本开始重构了验证上下文的公开API,
ValidationContext<T>不再对外暴露Rule属性,原有的通过context.Rule.CurrentValidator.Options.Severity修改严重级别的写法属于访问内部实例属性的逻辑,在新版本中已被移除出公开API范畴。 - 分场景适配方式:
- 固定Severity配置场景(推荐优先使用)
不需要在自定义验证器内部编写Severity设置逻辑,直接在验证规则定义的链式调用中通过WithSeverity方法指定即可,示例代码:
// 对应实体的验证类中定义规则 RuleFor(x => x.TargetProperty) .SetValidator(new YourCustomValidator()) .WithSeverity(Severity.Warning); // 直接指定该验证规则的固定严重级别- 运行时动态设置Severity场景
如果需要根据验证时的入参、属性值、上下文信息动态决定严重级别,不需要访问规则链配置,直接在验证失败时给返回的ValidationFailure对象指定Severity属性即可,示例自定义验证器代码:
using FluentValidation; using FluentValidation.Validators; public class CustomAgeValidator : PropertyValidator<User, int> { public override string Name => "AgeRangeCheck"; public override bool IsValid(ValidationContext<User> context, int ageValue) { // 自定义验证逻辑:比如年龄小于12岁触发校验 if (ageValue < 12) { // 动态计算需要设置的严重级别,比如根据用户角色不同返回不同级别 var currentSeverity = context.InstanceToValidate.IsVip ? Severity.Info : Severity.Error; // 新增验证失败条目时直接指定Severity context.AddFailure(new ValidationFailure( context.PropertyPath, "年龄不符合参与活动要求" ){ Severity = currentSeverity }); return false; } return true; } protected override string GetDefaultMessageTemplate(string errorCode) => "年龄校验不通过"; } - 固定Severity配置场景(推荐优先使用)
注意:不推荐通过反射或者转换为内部接口的方式强行访问
ValidationContext<T>隐藏的Rule属性修改配置,这类属于非公开API,后续小版本迭代都可能发生变更,没有兼容性保障。
内容的提问来源于stack exchange,提问作者Eric Murchie-Beyma
相关产品推荐
相关产品推荐

