Как избежать дублирования в 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 ответ
Решение
Убедитесь, что ваш
CreateRequest
а такжеUpdateRequest
Реализация одного и того же интерфейса наследуется от некоторого базового класса (или одного от другого).public CreateRequest: Request{...} public UpdateRequest: Request{...}
Создайте универсальный класс валидатора с ограниченным параметром универсального типа.
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 } }
Создайте актуальный валидатор, используя наследование.
public CreateRequestValidator: RequestValidator<CreteRequest> { CreateRequestValidator() { } } public UpdateRequestValidator: RequestValidator<UpdateRequest> { UpdateRequestValidator() { RuleFor(p => p.Id)... } }