namespace Test
{

    public class A
    {
        public string Name { get; set; }
    }    
    public class AValidator : AbstractValidator<A>
    {
        public AValidator()
        {
            RuleFor(t => t.Name)
                .NotEmpty()
                .MinimumLength(10)
                .MaximumLength(20);
        }
    }

    public class B
    {
        public string Name { get; set; }
    }    
    public class BValidator : AbstractValidator<B>
    {
        public BValidator()
        {
            RuleFor(t => t.Name)
                .NotEmpty()
                .MinimumLength(10)
                .MaximumLength(20);
        }
    }
}

Попытался создать общий вид:

namespace Test2
{
    public interface IPerson
    {
        public string Name { get; set; }
    }

    public abstract class CommonABValidators<T> : 
                           AbstractValidator<T> where T : IPerson
    {
        protected CommonABValidators()
        {
            RuleFor(x => x.Name).NotNull();
        }
    }
}

Но позвонив

public class AValidator : CommonABValidators<A>

Он должен быть преобразован в IPerson, но в моем случае у меня есть разные реквизиты в A, которые не могут быть преобразованы в IPerson.

Любая идея, как извлечь общие параметры в общий валидатор?

-1
Alex 3 Фев 2022 в 17:38

2 ответа

То, что вы сделали, выглядит правильно. Просто убедитесь, что ваш класс A реализует интерфейс IPerson, и валидатор начнет работать.

0
Tony Troeff 3 Фев 2022 в 17:40
Я просто это понял :)
 – 
Alex
3 Фев 2022 в 17:43

Другой вариант, который вы можете попробовать, это Include rules. Здесь вы можете найти официальную документацию: https://docs.fluentvalidation.net/ ru/latest/include-rules.html

Все, что вам нужно, это вызвать Include(new CommonValidator());, и общие правила будут автоматически включены без наследования общего базового типа.

0
Tony Troeff 3 Фев 2022 в 17:42
Вы можете отредактировать уже опубликованный ответ.
 – 
Guru Stron
3 Фев 2022 в 17:55