Я нахожусь на ядре ASP.NET и в новом MediatR which supports pipelines. Мой трубопровод includes validation.Двойная проверка в конвейере MediatR
Рассмотрим это действие:
[HttpPost]
[HandleInvalidCommand]
public IActionResult Foo(Command command)
{
await _mediator.Send(command);
return View();
}
- Команда проверяется (я использую FluentValidation)
HandleInvalidCommand
проверкиModelState.IsValid
и если недействительна затем перенаправляет к просмотру для пользователей, чтобы исправить данные- Искомый пробег
- Команда отправлена в трубопровод
- Трубопровод проверяет команду, AGAIN
Итак, если команда действительна, проверка выполняется дважды (и валидаторы дороги для запуска).
Как лучше всего с этим справиться?
EDIT: Очевидным способом является удаление валидации из конвейера, но это не хорошо, потому что команда может поступать из пользовательского интерфейса, а также из самого приложения. И вы хотите получить подтверждение в обоих случаях.
Значит, атрибут 'HandleInvalidCommand' запускает проверку? –
@ MickaëlDerriey Nope FluentValidation автоматически проверяет аргументы при привязке модели. Этот атрибут просто проверяет «ModelState.IsValid» и перенаправляет представление. Я отредактировал, чтобы сделать его более ясным. – grokky
ОК. так что да, я думаю, вам нужно выбирать между запуском проверки как частью привязки модели или как часть конвейера MediatR. Это действительно * это зависит от ситуации. С одной стороны, наличие во время привязки модели облегчает работу с уровнем MVC с ошибками. С другой стороны, использование его как части конвейера MediatR делает его сквозной задачей, поэтому применимо, если вы решите подключить трубопровод в другом приложении/каркасе. Тем не менее, обработка ошибок может быть сложнее. Поведение проверки может вызвать исключение, которое мог бы обработать фильтр действий. –