FluentValidation。在子集合规则中使用父属性值。

问题描述 投票:0回答:1

我有这个验证器。

 public class InputValidator : AbstractValidator<InputData>
{
    public InputValidator()
    { 
        RuleFor(inputData => inputData.Ucl).GreaterThan(0).....;

        RuleForEach(inputData => inputData.Loads).ChildRules(inputData => {            
              inputData.RuleFor(load => load.Position).GreaterThan(0).....); 
            });
... etc

然而:"位置"(在每个负载中)必须小于Ucl(在InputData中)。Position(在每次加载中)也必须小于Ucl(在InputData中).我如何为这样的关系(父参数与子参数)制定一个规则?

c# fluentvalidation vs-2019
1个回答
1
投票

我觉得没有一个很好的方法来做内联。子规则不允许你传入父对象。Must 而且我认为 Custom (通过 context.ParentContext.InstanceToValidate maybe)将允许您添加涉及父项和子项的规则,但这些规则将针对集合而不是每个项目。更好的方法,也是我通常会做的方法,是为你的 Load 实体。

public class LoadValidator : AbstractValidator<Load>
{
    public LoadValidator(InputData inputData)
    {
        RuleFor(load => load.Position)
                .GreaterThan(0).WithMessage("Position must be greater than 0")
                .LessThan(inputData.Ucl).WithMessage("Position must be less than Ucl");     
    }
}

这样就可以重复使用了,测试起来也方便多了。然后使用 SetValidator 来使用它。

public class InputDataValidator : AbstractValidator<InputData>
{
    public InputDataValidator()
    {
        RuleFor(inputData => inputData.Ucl)
            .GreaterThan(0).WithMessage("Ucl must be greater than 0");

        RuleForEach(inputData => inputData.Loads)
            .SetValidator(inputData => new LoadValidator(inputData));
    }
}

可重复使用的属性验证器 可能是另一种方法,但对我来说,必须是一个相当高级别的通用案例,才会去实施。

© www.soinside.com 2019 - 2024. All rights reserved.