Столкнулся с проблемой как внести изменения в несколько агрегатов за один запрос (знаю что это крайне не рекомендуется, но придумать как это обойти пока не могу).
Суть
- Есть агрегат объявление пользователя, к которому могут прикрепляться/загружаться фотографии (сейчас это реализованно как коллекция идентификаторов изображений).
- Есть агрегат изображение. При загрузке нового изображения, оно помечается как временное и если никто не изменит его статус на постоянное, оно будет удалено через определенное время.
После создания нового объявления, нужно все изображения, которые были загружены пользователем, пометить как постоянные.
Сценарий №2
После редактирования объявления, нужно все удаленные изображения пометить как временные (чтобы сборщик мусора их вычистил), а новые пометить как постоянные.
Как реализовано сейчас
На данный момент оба сценария я реализовал через доменные события, в обработчиках данных событий я обращаюсь к application сервисам (persist и expire), чтобы пометить картинки как временные/постоянные. Все происходит в той же транзакции, что и создание/изменение самого пользовательского объявления.
Вопросы
- На сколько текущая реализаци корректна?
- Может стоить выделить изменение статусов картинок в отдельную транзакцию? а в будущем уже вынести это действие в воркеры
- Насколько корректно изменять статус всех картинок (те что были удалены/добавлены) в одной транзакции? т.е. изменять много агрегатов одного типа в рамках одной транзакции
P.S. Любые ваши идеи приветствуются