FluentValidator为所有模型添加_validateService

问题描述

我需要创建流利的_validator,其中我将不会仅使用一种模型。如果我的控制器需要更多型号?我要为每个模型创建_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);
    }
}

Controller.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中需要多个模型。

解决方法

我认为使流利的验证器通用化没有多大意义,因为所有模型都可能具有不同的属性,并且需要不同的验证来验证属性。

除非您的这些模型继承一个通用类,否则您可以使用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);
        }
    }

或者您可以看看this