DDD: где разместить обработчики событий домена?

13

Не могли бы вы высказать свое мнение о том, какой слой подходит для размещения обработчиков событий домена в DDD? Например, у меня есть служба приложений для добавления нового контракта, и я хотел бы отправить уведомление по электронной почте контактному лицу, когда контракт будет добавлен, так же как и служба отправки сообщений (которая обрабатывает событие ContractAdded), служба приложений или служба домена или что-то другое?

Toni
источник

Ответы:

12

Я размещаю обработчики событий домена на уровне приложений.

Доменное событие - это способ сообщить внешним слоям (или внешнему миру), что что-то произошло в доменном слое. Что делать с событием, зависит от приложения. Приложение может уведомить пользователя об изменениях или может вызвать другой домен, чтобы что-то сделать. Приложение отвечает за управление операциями домена в ответ на действия пользователя, веб-запросы или события домена.

Евгений Худой
источник
1
+1 за прикладной уровень. В дизайне pub-sub событие домена может активировать общую логику в разных местах / системах / микросервисах. Если один из подписчиков является приложением, смоделированным с использованием DDD, событие инициирует некоторую обработку в этом приложении / BC. Эта обработка может потребовать разграничения транзакций, управления доступом, координации, которая обычно выполняется на прикладном уровне.
Пауло Мерсон
2

Оригинальная книга DDD (Evans 2004) объясняет прикладной уровень как тонкий слой, который обрабатывает доменные объекты в ответ на действия пользователя. Поэтому типичные обработчики событий для доменных событий не относятся к прикладному уровню.

Возможно, имеет смысл разместить некоторые из них на доменном уровне, если вы не нарушите уровень, создав зависимость вверх.

Если у вас есть уровень инфраструктуры, который находится ниже уровня домена, обработчик событий не может быть там, так как он нарушил бы уровень.

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

Гудмундур Орн
источник
2

Я размещаю обработчики событий домена на уровне домена как интерфейс домена IDomainEventHandler.

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

Можно подумать о примере, где заказ подтвержден и, следовательно, должен быть создан запрос на выставление счета. У нас есть событие OrderConfirmedEvent, которое произошло. Политика в нашем домене будет отвечать за подписку на это событие и создавать команду домена, RequestInvoiceкоторая будет обрабатываться обработчиком команд и обрабатываться им соответствующим образом.

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

Однако у нас есть

diegosasw
источник