Итак, возьмем обычный пример заказа. Предполагая, что у модели с богатым доменом есть вызов Order.place(). Кажется, что в наши дни есть дополнительные задачи, связанные с этим действием: указывает на события домена. Итак, допустим, этот вызов вызывает событие «OrderPlaced». Обычная вещь, которая происходит после размещения события, заключается в том, что мы отправляем электронное письмо с подтверждением, поэтому мы создаем прослушиватель событий для этого события и отправляем электронное письмо.Отключить прослушиватели событий для доменных событий? или как прекратить выполнение в противном случае требуемых сообщений о событиях в конкретных случаях использования
Так просто: Order.place()> OrderPlaced события поднятого> EmailForOrderPlaced слушатель пожары> Электронная почта отправляется
У нас также есть регистрация, которая работает аналогичным образом поднятого (User.register()> UserRegistered события> Регистрация слушателей пожары> Электронная почта отсылается)
Однако:
проблема (а состоят задачи - оленья кожа иметь смысл - однако много реальных потребностей бизнеса не все равно):
Теперь мы хотим предложить функцию регистрации + заказа в одном и против обычного электронного письма на регистрацию + одно электронное письмо для заказа, мы хотим только отправить одно электронное письмо, содержащее оба. Это опасная проблема, поэтому мы обычно создаем службу домена, которая делает это, однако, если мы вызываем User.register(); Order.place(); теперь он будет запускать 2 события, как обычно, рассылает клиенту электронные письма (нормально, но это не так, но это пример)
Итак, как нам обойти это? Очевидно, что отправка комбинированного сообщения электронной почты не является проблемой, потому что мы можем поднять событие для этого в службе, но это все равно оставляет нам оригинальные 2 письма. Если я отключу 2 слушателя в службе до того, как я выполню 2 вызова, это на самом деле означает, что я должен знать об их функциональности, и каждый раз, когда добавляется новый, я должен вернуться к службе, , и т. д., есть ли лучший способ, который бы легко сделал это?