Пользовательская свободная проверка с объединением NotEmpty () и When () - PullRequest
0 голосов
/ 02 ноября 2018

Модель - Product.cs

public string id { get; set; }
public string name { get; set; }
public string type { get; set; }
public string status { get; set; }

Правило проверки текучести

RuleFor(x => x.id).NotEmpty().When(x => x.status == "FIN").WithMessage("This field is required").IsValidInt();
RuleFor(x => x.name).NotEmpty().When(x => x.status == "FIN").WithMessage("This field is required");
RuleFor(x => x.type).NotEmpty().When(x => x.status == "FIN").When(x=>x.status == "FIN").WithMessage("This field is required").DDLIdExist();

Здесь IsValidInt() и DDLIdExist() - мои пользовательские правила проверки. Также он только проверяет, является ли поле не пустым, когда статус установлен на FIN .

Теперь, как вы можете видеть, часть ниже довольно повторяющаяся.

NotEmpty().When(x => x.status == "FIN").WithMessage("This field is required")

Таким образом, мой вопрос заключается в том, могу ли я объединить эти два правила в одну пользовательскую функцию проверки, которая принимает x.status в качестве аргумента и печатает «Это поле обязательно для заполнения». Если да, то как?

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Вы можете заключить эти вызовы в метод расширения:

private static X RequiredWhenFIN(this Y y) => y.NotEmpty().When(x => x.status == "FIN").WithMessage("This field is required");

Где Y - это тип, возвращаемый RuleFor(), а X - это тип, возвращаемый WithMessage().

Затем выполните рефакторинг своего теста следующим образом:

RuleFor(x => x.id).RequiredWhenFIN().IsValidInt();
RuleFor(x => x.name).RequiredWhenFIN();
RuleFor(x => x.type).RequiredWhenFIN().DDLIdExist();
0 голосов
/ 02 ноября 2018

Вы должны создать подкласс класса AbstractValidator и определить свое пользовательское правило, чтобы иметь больше контроля.

public class ProductValidator : AbstractValidator<Product> {
  public ProductValidator() {
   RuleFor(x => x.Status).Custom((text, context) => {
     if(text == "FIN" || string.IsNullOrEmpty(text)) {
       context.AddFailure("This field is required");
     }
   });
  }
}

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

См. Документы здесь

...