Свободные условные правила проверки

У нас есть условное требование, что непустое правило должно применяться к полю только при включенном флаге. Что-то вроде кода ниже.

Это правильный подход?

public AccountSetupModelValidator(ISessionProvider sessionProvider)
    {
        var regexPatterns = new RegExPatterns();

        RuleFor(x => x.MemorableDate)
            .NotEmpty().WithLocalizedMessage(ResourceAreas.Messages.Message_AccountSetup_1001_memorabledate);


        RuleFor(x => x.MemorableDateAnswer)
            .NotEmpty().WithLocalizedMessage(ResourceAreas.Messages.Message_AccountSetup_1001_memorabledateanswer)
            .Matches(regexPatterns.MemorableDateFormat).WithLocalizedMessage(ResourceAreas.Messages.Message_Onboarding_100007_memorabledateinvalidformat)
            .Length(5).WithLocalizedMessage(ResourceAreas.Messages.Message_Onboarding_100006_maxlength);

       RuleFor(x => x.SecurityQuestion)
           .NotEmpty().WithLocalizedMessage(ResourceAreas.Messages.Message_AccountSetup_1001_securityquestion);

        RuleFor(x => x.SecurityAnswer)
            .NotEmpty().WithLocalizedMessage(ResourceAreas.Messages.Message_AccountSetup_1001_securityanswer) 
            .Length(1, 40).WithLocalizedMessage(ResourceAreas.Messages.Message_Onboarding_100006_maxlength);

        if (sessionProvider.OnboardingApplicationData.ToggleNavigationView.HasProvisionalAccount)
        {

              RuleFor(x => x.TempCardNumber)
                .NotEmpty().WithLocalizedMessage(ResourceAreas.Messages.Message_AccountSetup_100006_tempcard)
                .Matches(regexPatterns.NumericOnly)
                .WithLocalizedMessage(ResourceAreas.Messages.Message_Onboarding_100007_numbersonly)
                .Length(15).WithLocalizedMessage(ResourceAreas.Messages.Message_AccountSetup_100006_tempcard);

            RuleFor(x => x.SecurityCode)
                .NotEmpty().WithLocalizedMessage(ResourceAreas.Messages.Message_AccountSetup_100006_tempcard)
                .Matches(regexPatterns.NumericOnly)
                .WithLocalizedMessage(ResourceAreas.Messages.Message_Onboarding_100007_numbersonly)
                .Length(4).WithLocalizedMessage(ResourceAreas.Messages.Message_AccountSetup_100006_securitycode);
        }

    }

person user845405    schedule 18.02.2015    source источник


Ответы (1)


Я бы рекомендовал не пытаться зависеть от вашего sessionProvider, так как это значительно усложняет независимое тестирование ваших валидаторов.

Вместо этого используйте условные методы When() и Unless() в FluentValidation. .

Если ваше свойство HasProvisionalAccount находится (или может быть помещено) в класс модели, вы можете переписать раздел следующим образом:

// remove the if() statement, and use .When()
RuleFor(x => x.TempCardNumber)
    .NotEmpty().WithLocalizedMessage(ResourceAreas.Messages.Message_AccountSetup_100006_tempcard)
    .Matches(regexPatterns.NumericOnly)
    .WithLocalizedMessage(ResourceAreas.Messages.Message_Onboarding_100007_numbersonly)
    .Length(15).WithLocalizedMessage(ResourceAreas.Messages.Message_AccountSetup_100006_tempcard)
    .When(x => x.HasProvisionalAccount);

RuleFor(x => x.SecurityCode)
    .NotEmpty().WithLocalizedMessage(ResourceAreas.Messages.Message_AccountSetup_100006_tempcard)
    .Matches(regexPatterns.NumericOnly)
    .WithLocalizedMessage(ResourceAreas.Messages.Message_Onboarding_100007_numbersonly)
    .Length(4).WithLocalizedMessage(ResourceAreas.Messages.Message_AccountSetup_100006_securitycode)
    .When(x => x.HasProvisionalAccount);

Каждое правило будет выполняться только в том случае, если HasProvisionalAccount имеет значение true.

person Raul Nohea Goodness    schedule 20.03.2015