Это нормально для уровня приложений с многоэтапным процессом, чтобы не использовать уровень домена
Я работаю над N-Layered приложением.NET со следующими уровнями:
- презентация
- заявка
- Домен
- Инфраструктура (содержит постоянство и общие служебные функции, такие как электронная почта)
В какой-то момент в моей заявке запрос был одобрен. После утверждения, есть 4 шага, которые должны быть выполнены следующим образом:
- Присвойте код метки товара выданному товару в Запросе.
- Измените статус запроса с "Обрабатывается" на "Заказ выполнен"
- Отправьте запрос автору по электронной почте, указав, что его товар готов к вывозу.
- Отправьте электронное письмо менеджеру запрашивающей стороны, информирующее их о том, что было дано их сотруднику, и копию запроса, который они одобрили для продукта.
Вышеуказанные шаги должны быть частью атомарной операции, означающей, что все они должны быть выполнены, или действие отменено. Я думаю о том, чтобы прикладной уровень управлял хранилищем запросов и постоянным уровнем для выполнения следующих задач:
- Уровень приложений запрашивает репозиторий запросов на выполнение шагов 1 и 2 как единицу рабочей транзакции
- Уровень приложений запрашивает уровень инфраструктуры для выполнения шагов 3 и 4.
Я не совсем уверен, должен ли уровень приложений делать это. Я думаю, это потому, что первые 2 действия требуют подключения к хранилищу, что я избегал делать на уровне домена. Последние 2 шага включают уровень инфраструктуры, с которым уровень домена может взаимодействовать через внедренный экземпляр зависимости. Следуя этой логике, прикладной уровень не просит доменный уровень что-либо делать. Является ли это обычно так для многоступенчатого процесса, подобного этому, когда у вас есть прикладной уровень? Или я что-то здесь упустил?
Мне известна структура, называемая Windows Workflow, но я не уверен, поможет ли это в этом случае, так как этот многоэтапный процесс не предполагает взаимодействия с человеком на этапах обработки, когда вещи могут ждать несколько дней. Я также не хочу делать приложение слишком сложным, если мне не нужно.
Заранее спасибо.
1 ответ
Шаги 1 и 2 в вашем вопросе звучат для меня как логика предметной области. Так что нет, это не хорошо. Эти два шага должны быть выполнены в домене. Вы можете сделать следующее:
В службе приложения загрузите соответствующий агрегат (вероятно,
Request
).Либо вызовите операцию, которая выполняет шаги 1 и 2 на
Request
или (если операция на самом деле не принадлежитRequest
) вызвать службу домена, которая выполняет эти два шага.После завершения операции домена служба приложения может сохранить измененную
Request
вернуться в БД.Если вышеуказанные шаги успешны, вы можете отправить электронные письма. У вас должен быть какой-то механизм повторных попыток, чтобы в конечном итоге электронное письмо было отправлено, даже если возникла временная проблема.
Если изменения на втором этапе изменяют более одного агрегата, процесс становится немного более сложным. Саги, как упоминалось в комментариях, являются одним из решений этой проблемы. Тем не менее, отдельные изменения являются операциями в домене, поэтому смоделируйте их соответствующим образом.
Как предложил plalx в комментарии, отправка электронных писем может быть выгружена потребителю события домена, если у вас есть инфраструктура событий. Это обычно решает механизм повтора бесплатно.