Подтвердить что ты не робот

С# FluentValidation для иерархии классов

У меня есть иерархия классов данных

public class Base
{
    // Fields to be validated
}

public class Derived1 : Base
{
    // More fields to be validated
}

public class Derived2 : Base
{
    // More fields to be validated
}

Каким будет подходящий способ для проверки Derived1 и Derived2 с использованием инфраструктуры FluentValidation без дублирования правил для полей базового класса?

4b9b3361

Ответ 1

Один из подходов:

public class Base
{
    public string BaseName { get; set; } 
}

public class Derived1 : Base
{
    public string Derived1Name { get; set; }
}

public class BaseValidator<T> : AbstractValidator<T> where T : Base
{
    public BaseValidator()
    {
        RuleFor(b => b.BaseName).NotNull();
    }
}

public class Derived1Validator : BaseValidator<Derived1>
{
    public Derived1Validator()
    {
        RuleFor(d => d.Derived1Name).NotNull();
    }
}

Итак, сначала создайте свой валидатор базы, чтобы он принял аргумент общего типа и укажите, что общий тип должен иметь тип base. Настройте свои общие правила для базового класса и продолжайте.

Для любых валидаторов, которые проверяют дочерние элементы вашего базового класса, у вас есть эти валидаторы, наследуемые от baseValidator, где T будет вашим производным типом класса.

Ответ 2

public class Derived2Validator : AbstractValidator<Derived2>
{
    public Derived2Validator()
    {
        Include(new BaseValidator());
        Include(new Derived2Validator());
        RuleFor(d => d.Derived1Name).NotNull();
    }
}

Derived2Validator не нужно наследовать BaseValidator или Derived1Validator. Метод Include будет включать в себя правила из базовых валидаторов.