FluentValidation: использование значения родительского свойства в правиле дочерней коллекции - PullRequest
0 голосов
/ 01 мая 2020

У меня есть этот валидатор:

 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). Как я могу создать правило для такого отношения (родительский параметр против дочернего параметра)?

1 Ответ

1 голос
/ 02 мая 2020

Я не думаю, что есть хороший способ сделать это встроенным. Дочерние правила не позволяют передавать родительский объект. Must, и я думаю, что Custom (возможно, через context.ParentContext.InstanceToValidate) позволит вам добавить правила (правила), касающиеся как родителя, так и потомка, но правило (правила) будет против коллекции, а не против каждого элемента. Лучший способ и то, как я обычно это делал бы, это создать дочерний валидатор для вашей 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));
    }
}

Многоразовые валидаторы свойств может быть другим способом сделать это, но для меня это должен быть достаточно высокий уровень / generi c дело, которое нужно реализовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...