Установить правило на основе результата логического выражения с помощью FluentValidation - PullRequest
0 голосов
/ 04 октября 2018

У меня есть класс Property, который содержит следующие три свойства:

bool CorrespondanceAddressIsSecurityAddress
Address CorrespondanceAddress
Address SecurityAddress

Класс адреса - это просто базовый класс адреса, который содержит сведения об адресе пользователя.

Адрес для переписки пользователя всегда будет заполнен и, следовательно, должен быть подтвержден.У пользователя есть возможность выбрать, что его адрес соответствия совпадает с его защитным адресом, когда это происходит, нет необходимости проверять защитный адрес, и его можно оставить пустым.

Что я хотел быdo проверяет состояние логического значения CorrespondanceAddressIsSecurityAddress, а затем устанавливает валидатор для адреса безопасности, если для него задано значение false, но я не уверен в синтаксисе, необходимом для этого.

Atв тот момент, когда класс, управляющий проверкой для класса свойств, содержит две следующие строки:

RuleFor(p => p.CorrespondanceAddressIsSecurityAddress)
   .NotNull()
   .WithMessage("CorrespondanceAddressIsSecurityAddress cannot be null");
RuleFor(p => P.CorrespondanceAddressIsSecurityAddress
   .Equals(false))
   .SetValidator(new FluentAddressValidator());

Однако второе правило, которое устанавливает валидатор, дает синтаксическую ошибку, говоря:

Невозможно преобразовать из '... FluentAddressValidator' в 'FluentValidation.Validators.IPropertyValidator

Как мне установить правило, основанное на значении логического значения?

1 Ответ

0 голосов
/ 04 октября 2018

Методы When и Unless могут использоваться для указания условий, управляющих временем выполнения правила.Метод Unless просто противоположен When

В соответствии с вопросом вы должны написать свой валидатор следующим образом:

public class PropertyValidator : AbstractValidator<Property>
{
    public PropertyValidator()
    {
        RuleFor(x => x.CorrespondanceAddress)
            .NotNull().WithMessage("Correspondence address cannot be null")
            .SetValidator(new AddressValidator());
        RuleFor(x => x.SecurityAddress)
            .NotNull().WithMessage("Security address cannot be null")
            .SetValidator(new AddressValidator())
            .When(x => !x.CorrespondanceAddressIsSecurityAddress); // applies to all validations chain
          //.Unless(x => x.CorrespondanceAddressIsSecurityAddress); - do the same as at previous line
    }
}

Если вам нужно указатьто же самое условие для нескольких правил, тогда вы можете вызвать метод When верхнего уровня вместо цепочки вызова When в конце правила:

When(x => !x.CorrespondanceAddressIsSecurityAddress, () => 
{
    RuleFor(x => x.SecurityAddress)
       .NotNull().WithMessage("Security address cannot be null")
       .SetValidator(new AddressValidator());
    // another RuleFor calls
});

Ссылка надокументация

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