FluentValidation链式规则中的验证器是否接收缓存的实例或属性值?
问题原理说明
同一条RuleFor链式调用下的所有验证器,会在验证启动时一次性读取目标属性的初始值并缓存,后续链上所有验证器都会复用这个缓存值,不会在每个验证器执行完成后重新读取属性的最新值。你在MyCustomValidator中给属性赋的新值不会被后续链式调用的NotNull验证器捕获,所以会验证失败。
拆分两条独立RuleFor时,每条规则都会单独触发一次属性值读取,第一条规则完成属性赋值后,第二条规则读取的是最新的赋值结果,所以验证可以正常通过。
单条RuleFor的实现方案
如果你不想拆分多条RuleFor,可以通过以下两种方式实现需求:
- 方案1:用内联委托验证替代内置的
NotNull验证器,直接从实例读取最新属性值
RuleFor(x => x.MyProperty) .SetValidator(new MyCustomValidator()) .Must((instance, _) => instance.MyProperty != null) .WithMessage("'MyProperty' 不能为空");
- 方案2:使用
DependentRules声明依赖规则,依赖规则会在前置验证完成后重新读取属性值
RuleFor(x => x.MyProperty) .SetValidator(new MyCustomValidator()) .DependentRules(() => { RuleFor(x => x.MyProperty).NotNull(); });
内容的提问来源于stack exchange,提问作者Dirk S.
相关产品推荐
相关产品推荐

