规则中的 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;
}
....
}
我需要澄清 属性 的实例是如何被验证的,是如何传递给规则中的每个验证器的。
让我们假设如下:
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”开始时,正在验证的实例 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;
}
....
}