Кроме того, помимо всех представленных здесь ответов, обработчик события может также вызвать команду после получения уведомления о том, что событие произошло.
Скажем, например, что после создания Customer вы также хотите инициализировать некоторые значения учетных записей и т. Д. После того, как ваш Customer AR добавит событие в EventDispatcher, и оно будет получено объектом CustomerCreatedEventHandler, этот обработчик может вызвать отправку команда, которая выполнит все, что вам нужно и т. д.
Кроме того, существуют DomainEvents и ApplicationEvents. Разница просто концептуальная. Сначала вы хотите отправить все события вашего домена (некоторые из них могут вызывать события приложения). Что я имею в виду под этим?
Инициализация учетной записи после события CustomerCreatedEvent является событием DOMAIN. Отправка клиенту уведомления по электронной почте является событием подачи заявки.
Причина, по которой вы не должны смешивать их, ясна. Если ваш SMTP-сервер временно не работает, это не означает, что это повлияет на вашу ОПЕРАЦИЮ ДОМЕНА. Вы по-прежнему хотите сохранить неиспорченное состояние своих агрегатов.
Обычно я добавляю события в мой Диспетчер на уровне совокупного корня. Это события DomainEvents или ApplicationEvents. Может быть и то, и другое. Как только мой обработчик команд завершен, и я вернулся в стек с кодом, который выполняет обработчик команд, я проверяю свой диспетчер и отправляю любое другое DomainEvent. Если все это успешно, то я закрываю транзакцию.
Если у меня есть какие-либо события приложений, самое время их отправить. Отправка электронного письма не обязательно требует открытого соединения с базой данных или открытой области транзакции.
Я немного отошел от первоначального вопроса, но вам также важно понять, как события могут также концептуально трактоваться по-разному.
Тогда у вас есть саги .... но это WAYYYY за рамками этого вопроса:)
Имеет ли это смысл?