Если вы используете сообщения (например, Service Bus / RabbitMQ), то я думаю, что решение, которое вы описали, является лучшим. Этот тип дизайна - когда службы обладают знаниями о других доменах в системе - обычно называется хореографией.
Вы захотите выбрать сервис, который будет отвечать за эту бизнес-логику. Эта служба должна будет получать все предыдущие типы сообщений, чтобы она могла определить, когда (если) все они были выполнены, что, вероятно, она хочет сделать, записав, какие ворота уже прошли в базе данных.
Одна из альтернатив, которую вы могли бы рассмотреть, - это связывание бизнес-процессов вместо параллельного выполнения. Итак ...
- PAYBILL заставляет FinanceService дебетовать бухгалтерскую книгу и запускать "PaymentPosted"
- "PayentPosted" заставляет EmailService отправлять электронные письма Клиенту, который поблагодарил вас за оплату счета и передает "CustomerPaymentEmailSent"«
- « CustomerPaymentEmailSent »заставляет DicsountService проверить, получают ли они скидку за своевременную оплату, а затем отправляет« CustomerCanGetPaymentDiscount »
- Электронное письмо, которое вы хотите отправить, только что инициировано« CustomerCanGetPaymentDiscount ».
Если честно, я бы переключился на модель зависимости, которую вы используете на этом последнем этапе. Таким образом, вместо того, чтобы какой-либо компонент прослушивал события «CustomerCanGetPaymentDiscount» из DiscountService и отправлял электронное письмо, я думаю, что вместо этого DiscountService скажет другому компоненту отправить электронное письмо. Мне кажется естественным для чего-то, что рассчитывает скидки, чтобы знать, что электронное письмо должно быть отправлено. Это кажется менее естественным для того, что отправляет электронные письма, чтобы узнать о скидках (и все остальное, что требует отправки электронных писем). Вот почему мне не нравятся архитектуры, в которых предполагается, что каждое сообщение должно быть событием, а каждое действие должно инициироваться событием: оно устраняет множество решений о том, где может жить логика домена, потому что получатель сообщения всегда должензнать о домене отправителя сообщения, а не наоборот.