Есть разные подходы к Domain Events — например, в вопросах асинхронной обработки или использования между модулями. Сейчас я ориентируюсь на следующие принципы:
1. Domain Events отражают значимые факты, произошедшие в предметной области. Domain Events — приватные детали реализации модуля.
2. Domain Events описывают уже произошедшие факты и именуются в прошедшем времени. Их состояние не изменяется после создания.
3. Domain Events чаще всего порождаются агрегатами или доменными сервисами и позволяют другим частям модуля реагировать на произошедшее без прямой связи с источником события.
4. Domain Events обрабатываются синхронно в той же транзакции, что и изменение агрегата. Если обработка завершается ошибкой, транзакция откатывается и состояние остаётся консистентным.
5. Внешние побочные эффекты — например, отправка писем, уведомлений и некритичных аудит-логов — не должны выполняться в транзакции Domain Event. Их можно вынести в асинхронный job, который запускается после коммита.
6. Данные Domain Events предназначены для внутренних обработчиков модуля. Они не обязаны быть сериализуемыми и могут содержать сложные доменные объекты.
7. Domain Events не предназначены для передачи между модулями, так как это нарушает инкапсуляцию.