или агрегат?
Почему возник этот вопрос.
Например, если публикацией событий занимается юзкейс:
экземплярАгрегата = репозиторий.верниМнеАгрегат(Айди);
экземплярАгрегата.измениСвойСостояние
репозиторий.сохрани(экземплярАгрегата)
события = агрегат.чтоПроизошло()
хранилищеСобытий.опубликуй(события)
Например, если публикацией событий занимается репозиторий:
репозиторий = фабрикаРепозиториев.создайРеп(дляСущности, сХранилищемСобытий)
пример реализации метода репозиторий.сохрани(агрегат):
// сохраняет
моё.хранилищеСобытий.опубликуй(агрегат.чтоПроизошло())
Или, если хранилище сбытий инжектится непосредственно в Агрегат при его воссоздании из репозитория. И он сам там сразу же публикует свои события с помощью внедренного в него хранилища.
В первом варианте разработчик прикладного кода может забыть опубликовать события накопленные агрегатом - печалька.
Во втором варианте вроде бы как нарушется СинглРеспонсибилити метода репозитория. Он не только сохраняет, но делает еще какую-то магию🤷🏻♂️
Ну и в третем варианте тоже что и во втором.
Так как лучше то?
Публикация это dispatch?
В моем представлении доменный сервис, но это не точно
вам сохранение событий нужно делать в репозиторий.сохрани(экземплярАгрегата)
Доменные события паблишиься в домене. Вы же в итоге интересуетесь ни кто из паблишит а кто отправляет. Ибо паблишинг и отправка две разные вещи. Отправляет инфраструктура обычно. Насчёт СРП так там как была одна причина для изменений так и осталась. Плюс композицию ни кто не отменял. А чтобы решить вопрос с синхронизацией сообщений и стейта берите Outbox pattern. Оно впринципе и не всегда нужно. Если мы знаем что можно делать ретрай сколько угодно раз то можно и не заморачиваться.
https://habr.com/ru/company/ispring/blog/569648/ спасибо. Нашел вот эту статейку. Тут как раз выбрали Transactional outbox
Обсуждают сегодня