Это нормально для уровня приложений с многоэтапным процессом, чтобы не использовать уровень домена

Я работаю над N-Layered приложением.NET со следующими уровнями:

  • презентация
  • заявка
  • Домен
  • Инфраструктура (содержит постоянство и общие служебные функции, такие как электронная почта)

В какой-то момент в моей заявке запрос был одобрен. После утверждения, есть 4 шага, которые должны быть выполнены следующим образом:

  1. Присвойте код метки товара выданному товару в Запросе.
  2. Измените статус запроса с "Обрабатывается" на "Заказ выполнен"
  3. Отправьте запрос автору по электронной почте, указав, что его товар готов к вывозу.
  4. Отправьте электронное письмо менеджеру запрашивающей стороны, информирующее их о том, что было дано их сотруднику, и копию запроса, который они одобрили для продукта.

Вышеуказанные шаги должны быть частью атомарной операции, означающей, что все они должны быть выполнены, или действие отменено. Я думаю о том, чтобы прикладной уровень управлял хранилищем запросов и постоянным уровнем для выполнения следующих задач:

  1. Уровень приложений запрашивает репозиторий запросов на выполнение шагов 1 и 2 как единицу рабочей транзакции
  2. Уровень приложений запрашивает уровень инфраструктуры для выполнения шагов 3 и 4.

Я не совсем уверен, должен ли уровень приложений делать это. Я думаю, это потому, что первые 2 действия требуют подключения к хранилищу, что я избегал делать на уровне домена. Последние 2 шага включают уровень инфраструктуры, с которым уровень домена может взаимодействовать через внедренный экземпляр зависимости. Следуя этой логике, прикладной уровень не просит доменный уровень что-либо делать. Является ли это обычно так для многоступенчатого процесса, подобного этому, когда у вас есть прикладной уровень? Или я что-то здесь упустил?

Мне известна структура, называемая Windows Workflow, но я не уверен, поможет ли это в этом случае, так как этот многоэтапный процесс не предполагает взаимодействия с человеком на этапах обработки, когда вещи могут ждать несколько дней. Я также не хочу делать приложение слишком сложным, если мне не нужно.

Заранее спасибо.

1 ответ

Шаги 1 и 2 в вашем вопросе звучат для меня как логика предметной области. Так что нет, это не хорошо. Эти два шага должны быть выполнены в домене. Вы можете сделать следующее:

  1. В службе приложения загрузите соответствующий агрегат (вероятно, Request).

  2. Либо вызовите операцию, которая выполняет шаги 1 и 2 на Request или (если операция на самом деле не принадлежит Request) вызвать службу домена, которая выполняет эти два шага.

  3. После завершения операции домена служба приложения может сохранить измененную Request вернуться в БД.

  4. Если вышеуказанные шаги успешны, вы можете отправить электронные письма. У вас должен быть какой-то механизм повторных попыток, чтобы в конечном итоге электронное письмо было отправлено, даже если возникла временная проблема.

Если изменения на втором этапе изменяют более одного агрегата, процесс становится немного более сложным. Саги, как упоминалось в комментариях, являются одним из решений этой проблемы. Тем не менее, отдельные изменения являются операциями в домене, поэтому смоделируйте их соответствующим образом.

Как предложил plalx в комментарии, отправка электронных писем может быть выгружена потребителю события домена, если у вас есть инфраструктура событий. Это обычно решает механизм повтора бесплатно.