Я хочу реализовать свое первое приложение, используя шаблон CQRS вместе с Event Sourcing. Мне интересно, как с созданием совокупных корней нужно обращаться правильно. Допустим, кто-то отправляет команду CreateItem. Как это должно быть обработано? Где должно храниться событие ItemCreated? Как первое событие нового предмета? Или у меня должна быть какая-то сущность ItemList, которая объединяет все элементы, а ее список событий состоит только из событий ItemCreated?
Уди Дахан предлагает не создавать совокупные корни и всегда использовать вместо этого какой-то метод извлечения. Но как я могу получить что-то новое и, конечно, не назначенный идентификатор. Я понимаю идею, лежащую в основе, и вполне разумно думать, что новый объект - это объект, состояние которого состоит из нулевых событий, ответивших на него. Но как мне это использовать? Должен ли я иметь отдельный метод в моем репозитории, например, getNewItem()
или сделать мой get(id)
метод принятия Optional<ItemId>
вместо этого?
Редактировать: После некоторого времени копания я нашел действительно интересную реализацию вышеупомянутых шаблонов с использованием актеров. Автор вместо того, чтобы создавать агрегат, извлекает его из какого-то репозитория с недавно созданным UUID. Недостаток этого подхода заключается в том, что он допускает временное несоответствие состояния. Мне также интересно, как я могу реализовать delete
метод с таким подходом. Просто добавить удаленное событие в список событий агрегата?