Мы используем fluentvalidation (с сервисным стеком) для проверки наших запросов DTO. Недавно мы расширили нашу инфраструктуру для приема запросов «PATCH», что означает, что теперь у нас есть требование применять проверку ТОЛЬКО тогда, когда исправление содержит проверяемое поле.
Мы сделали это с помощью метода расширения, такого как этот:
RuleFor(dto => dto.FirstName).Length(1,30)).WhenFieldInPatch((MyRequest dto)=>dto.FirstName);
RuleFor(dto => dto.MiddleName).Length(1,30)).WhenFieldInPatch((MyRequest dto)=>dto.MiddleName);
RuleFor(dto => dto.LastName).Length(1,30)).WhenFieldInPatch((MyRequest dto)=>dto.LastName);
Это означает, что мы можем запустить ту же проверку для POST / PUT или PATCH.
Я искал способ подключения к свободно распространяемой среде валидации таким образом, чтобы нам не нужно было дублировать правило .WhenFieldInPatch () в КАЖДОЙ строке в наших валидациях, но пока не нашел хорошего способа сделать это .
Я попытался сделать следующее:
- Создание вспомогательного метода (в базовом классе) для перехвата исходного «RuleFor», который добавляет предложение .When () вверх фронт, но это не работает, так как для быстрой проверки требуется, чтобы .When () был последним
- Перехватывать вызовы в PreValidation, но я могу перехватывать только на основе всего класса, а не на основании правила по правилу основа
- Добавление метода расширения для применения к концу каждого правила (как в примере), но я не могу получить доступ к начальному выражению, чтобы проверить, должно ли поле отображаться - поэтому я Нужно передать его снова.
Я что-то упускаю или пытаюсь сделать невозможное?
Спасибо