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