Как избежать дублирования в FluentValidations

У меня есть валидатор для CreateRequest и еще один для UpdateRequest,

Вскоре я обнаружил, что они одинаковы. Разница лишь в том, что у каждого есть Id (UpdateRequest).

Проверки одинаковы для одинаковых свойств, но сущности разные.

Как я могу избежать дублирования правил?

В настоящее время у меня есть

public class CreateValidator : AbstractValidator<CreateRequest> 
{
     RuleFor(p => p.Prop1)...  // Rule 1
     RuleFor(p => p.Prop2)...  // Rule 2
     RuleFor(p => p.Prop3)...  // Rule 3
}

public class UpdateValidator : AbstractValidator<UpdateRequest> 
{
     RuleFor(p => p.Id)...     // Rule 0
     RuleFor(p => p.Prop1)...  // Rule 1
     RuleFor(p => p.Prop2)...  // Rule 2
     RuleFor(p => p.Prop3)...  // Rule 3
}

Они одинаковы за исключением правила 0.

Могу ли я избежать дублирования?

1 ответ

Решение
  1. Убедитесь, что ваш CreateRequest а также UpdateRequest Реализация одного и того же интерфейса наследуется от некоторого базового класса (или одного от другого).

    public CreateRequest: Request{...}
    public UpdateRequest: Request{...}
    
  2. Создайте универсальный класс валидатора с ограниченным параметром универсального типа.

    public RequestValidator: AbstractValidator<T> where T: Request
    {
        RequestValidator()
        {
             RuleFor(p => p.Prop1)...  // Rule 1
             RuleFor(p => p.Prop2)...  // Rule 2
             RuleFor(p => p.Prop3)...  // Rule 3
        }
    }
    
  3. Создайте актуальный валидатор, используя наследование.

    public CreateRequestValidator: RequestValidator<CreteRequest>
    {
        CreateRequestValidator()
        { }
    }
    public UpdateRequestValidator: RequestValidator<UpdateRequest>
    {
        UpdateRequestValidator()
        {
             RuleFor(p => p.Id)...           
        }
    }
    
Другие вопросы по тегам