Подтвердите, что Invitation
еще не обработан (принят, отклонен и т. в нашем приложении. Давайте используем принцип DesignByContract и определим четкие правила, которые каждый слой (домен, приложение и т. Д.) Должен ожидать от других. Давайте определим правило, что команда, содержащая InvitationId
который не соответствует существующему Invitation
, не должен создаваться и отправляться.
ПРИМЕЧАНИЕ. Используемая здесь терминология может сильно различаться в зависимости от того, какой тип архитектуры используется в проекте (Многоуровневая архитектура,Шестигранный и т. Д.)
Это заставляет CommandCreator
проверить, существует ли Invitation
с указанным Id
перед отправкой команды.
В случае с APIRouteHandler
(контроллер приложений и т. д.), который примет запрос, должен будет:
- выполнить эту проверку самостоятельно
- делегировать кому-либо еще для проверки
Давайте далее определим, что это часть нашего ApplicationLayer
(или модуля, компонентов и т. Д. Не имеет значения, как он называется, поэтому я буду использовать Layer) и сделаем это ApplicationError
. Отсюда мы можем сделать это разными способами.
Один из способов - это DispatchConfirmInvitationCommandApplicationService
, который спросит у DomainLayer
, существует ли Invitation
с запрошенным Id
и выдаст ошибку (например, исключение), если это не так. Эта ошибка будет обработана RouteHandler
и будет отправлена обратно запрашивающей стороне.
Вы можете использовать как синхронизацию, так и асинхронную связь. Если это асинхронно, вам нужно создать механизм для этого. Вы можете обратиться к EnterpriseIntegrationPatterns для получения дополнительной информации об этом.
Главное здесь: Это не является частью домена
С этого момента все остальные в нашей системе должны учитывать, что приглашение с указанным Id
в ConfirmInvitationCommand
существует. Если это не так, это рассматривается как ошибка в системе и должно быть проверено разработчиками и / или администраторами. Должен быть ручной способ (административный бэкэнд) для отмены таких недопустимых команд, поэтому это необходимо учитывать при разработке системы, но это следует рассматривать как ошибку в системе.
Две другие проверки являются частьюиз Domain
.
Допустим, у вас есть
Invitation
совокупность InvitationConfirmationSaga
Давайтезаставить их эти агрегаты общаться с сообщениями. Давайте определим эти типы сообщений:
RequestConfirmInvitation
InvitationExpired
InvitationAlreadyProcessed
Вот основной поток:
А затем:
Если срок действия Invitation
истек, он отправляет сообщение InvitationExpired
InvitationConfirmationSaga
Если Invitation
обработан, он отправляет InvitationAlreadyProcessed
сообщение InvitationConfirmationSaga
Если Invitation
не истек, он принимается и отправляет InvitationAccepted
сообщениеInvitationConfirmationSaga
Тогда:
InvitationConfirmationSaga
получит эти сообщения и соответственно вызовет события.
Таким образом, высохранить логику домена в Domain
, в этом случае Invitation
Aggregate.