DDD: реализация доменных событий в монолитном приложении

Я провел небольшое исследование о предметных событиях и нашел несколько разных решений.

  • Решение Udi Dahan, которое обрабатывает события немедленно
  • События с отложенным доменом, которые в большинстве случаев запускаются в инфраструктуре
  • События домена, которые возвращают результат

Вопросы:

  • Какой из них является чисто доменными событиями?
  • Возможно ли иметь их всех в одном проекте?
  • В таком случае, как мне их назвать и отличить?
  • Где зарегистрировать EventHandler? Кто-то упомянул, что Служба приложений - это подходящее место, но здесь я видел, что она была зарегистрирована прямо в Модели Домена и там же обрабатывается, а не в отдельном классе обработчика событий.

Еще один дополнительный вопрос.

Например: когда заказ создан и оплачен, он должен получить статус "OrderPaid".

Поскольку покупка и заказ - это два разных контекста, сразу после создания Заказа нам нужно вызвать событие домена, которое должно обрабатываться обработчиком событий в ограниченном контексте покупки, но в результате обработки события должно возникнуть еще одно событие домена - OrderPaid, который может быть снова обработан контекстом Order. С монолитным приложением кажется, что может быть одно решение: передать объект Order в обработчики событий для достижения ожидаемого поведения. Есть ли другие способы, как это решить, в таком архитектурном стиле?

1 ответ

События домена были изобретены, чтобы обеспечить более инкапсулированную модель домена. Там нет чистой реализации как таковой, просто разные реализации с разными компромиссами. Вы можете разместить свои события в одном проекте, и в статьях, на которые вы ссылаетесь, содержится множество рекомендаций по наименованию событий.

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

Другие вопросы по тегам