FluentValidator. Добавьте _validateService для всех моделей

Мне нужно создать свободный _валидатор, где я не буду использовать только одну модель. Если мне нужно больше моделей в моем контроллере? Я создам для каждой модели _validator{modelName}?

Мой код

public class UserDtoValidator : AbstractValidator<UserDTO>
{
    public UserDtoValidator()
    {
        RuleFor(p => p.Email).NotEmpty().EmailAddress()
            .WithMessage("{PropertyName} should be not empty.");
        RuleFor(p => p.Password).NotNull().Length(5, 30)
            .WithMessage("{PropertyName} should be not empty.");
        RuleFor(p => p.PasswordConfirm).Equal(p => p.Password);
    }
}

Контроллер.cs

 private readonly IValidator<UserDTO> _validator;

    public UserController(IValidator<UserDTO> validator)
    {
        _validator = validator;
    }

HttpPost

 var validResult = _validator.Validate(model);
 if (validResult.IsValid)
 {

 }
 

Запускать

 services.AddControllers().AddFluentValidation();
 services.AddSingleton<IValidator<UserDTO>, UserDtoValidator>();

Это хорошая работа. Но мне нужно несколько моделей в моем _validator.


person Stas Stas    schedule 10.09.2020    source источник


Ответы (1)


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

Если эти ваши модели не наследуют общий класс, вы можете использовать BaseValidator для совместного использования метода проверки.

 public class Teacher 
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public string Gender { get; set; }
    }
    public class UserDTO  
    {
        public string Email { get; set; }
        public string Password { get; set; }
        public string PasswordConfirm { get; set; }
    }
   public class BaseValidator<T> : AbstractValidator<T> 
    {
        public BaseValidator()
        {
        }
    }

    public class TeacherValidator : BaseValidator<Teacher>
    {
        public TeacherValidator()
        {
            RuleFor(p => p.Name).NotEmpty().WithMessage("{PropertyName} should be not empty.");
            RuleFor(p => p.Age).InclusiveBetween(18, 60)
                .WithMessage("{PropertyName} should between 18-60.");
            RuleFor(p => p.Gender).Must(x => new string[] { "Male", "Female" }.Contains(x)).WithMessage("Then gender can only be male or female");
        }
    }
    public class UserDtoValidator : BaseValidator<UserDTO>
    {
        public UserDtoValidator()
        {
            RuleFor(p => p.Email).NotEmpty().EmailAddress()
                .WithMessage("{PropertyName} should be not empty.");
            RuleFor(p => p.Password).NotNull().Length(5, 30)
                .WithMessage("{PropertyName} should be not empty.");
            RuleFor(p => p.PasswordConfirm).Equal(p => p.Password);
        }
    }

Или вы можете посмотреть это.

person LouraQ    schedule 11.09.2020