规则中的 FluentValidation 链式验证器接收缓存实例 and/or 属性 值?

FluentValidation chained validators in rule receive cached instance and/or property value?

我需要澄清 属性 的实例是如何被验证的,是如何传递给规则中的每个验证器的。

让我们假设如下:

RuleFor(x => x.MyProperty).SetValidator(new MyCustomValidator()).NotNull();

MyCustomValidator 将在 MyProperty 上设置一个值,如果在某些情况下值为 NULL ].
我希望 NotNull 验证会通过。

然而,情况似乎并非如此。

当我将 RuleFor 分成两个单独的调用时:

RuleFor(x => x.MyProperty).SetValidator(new MyCustomValidator());
RuleFor(x => x.MyProperty).NotNull();

它按预期工作。
但是,当然,我想避免对同一个 属性

使用多个“RuleFor”语句

这让我相信在“RuleFor”开始时,正在验证的实例 and/or 属性 值是 cached/copied,然后提供给为该规则指定的每个验证器.

我还创建了一个 fiddle 来演示此行为:https://dotnetfiddle.net/rDTrDU

链接的一个将创建一个具有多个组件的 PropertyRule,当它们被处理时 FluentValidation caches property value and uses it for every component:

var accessor = new Lazy<TProperty>(() => PropertyFunc(context.InstanceToValidate), LazyThreadSafetyMode.None);

未链接的一个使用一个组件创建多个 PropertyRule,因此在第一个规则被验证后,MyObject 实例将被修改并且 属性 访问器将使用新值。

在你的情况下,我会尝试在 MyObjectValidator:

中使用 PreValidate
public class MyObjectValidator : AbstractValidator<MyObject>
{
    protected override bool PreValidate(ValidationContext<MyObject> context, ValidationResult result)
    {
        var version = context.RootContextData["SourceVersion"] as Version;
        if (version < new Version(2, 0, 0) && string.IsNullOrWhiteSpace(context.InstanceToValidate.MyProperty))
        {
            Console.WriteLine("\t[DEBUG]: Setting value to 'Hello world'");
            context.InstanceToValidate.MyProperty = "Hello world";
        }
        return true;
    }
  ....
 }