Обработчики цепочек с MediatR - PullRequest
       83

Обработчики цепочек с MediatR

2 голосов
/ 24 сентября 2019

Мы используем MediatR для реализации «Конвейера» для нашего внутреннего ядра WebAPI dotnet, пытаясь следовать принципу CQRS.

Я не могу решить, должен ли я попытаться реализовать цепочку IPipelineBehavior или лучше создать новый запрос и вызвать MediatR.Send из моего метода Handler (для запроса).

Сценарий по сути такой:

  • Пользователь запрашивает действие, которое нужно выполнить, т.е. удаляет что-то
  • Мы должны проверить, используется ли это кем-то кем-тоиначе
  • Мы должны отметить это что-то как удаленное в базе данных
  • Нам нужно фактически удалить файлы из файловой системы.

Вариант 1 - это то, что мы имеем сейчас: DeleteRequest, который обрабатывается одним классом, при этом обработчик проверяет, используется ли он, помечает ли он как удаленный, а затем отправляет новый TaskStartRequest с параметрами для удаления.

Вариант 2 - это то, что я рассматриваю: A DeleteRequest, который реализует интерфейсы маркеров IRequireCheck, IStartTask, с конвейером, который запускается:

  1. IPipelineBehavior<IRequireCheck> сначала проверьте, используется ли что-то,
  2. IPipelineBehavior<DeleteRequest>, чтобы отметить что-то как удаленное в базе данных, и
  3. IPipelineBehavior<IStartTask>, чтобы запустить задание.

Я не совсем понял, как будет выглядеть Вариант 2, но этоГлавная идея.

Полагаю, мне в основном интересно, пахнет ли код вызовом MediatR.Send (TRequest2) в обработчике для TRequest1.

1 Ответ

1 голос
/ 25 сентября 2019

Если это те опции, с которыми вы настроены - я говорю Вариант 2. Отправка запросов из существующих обработчиков Mediatr может восприниматься как запах кода.Вы скрываете побочные эффекты и нарушаете принцип единой ответственности.Вы также объединяете свои запросы, и вам следует избегать ситуаций, когда вы не можете отправить один тип запроса раньше другого.

Однако я думаю, что может быть альтернатива.Если запрос на удаление не может быть выполнен без предварительной проверки и пометки, вы можете использовать препроцессор ( пример здесь ) для TaskStartRequest.Таким образом, вы можете получить один запрос, который сделает все, что вам нужно.Это даже отражает ваш пример конвейера, просто используя существующие шаблоны Mediatr.

...