Я верю, что вы путаете вещи.Не существует такого понятия, как корневой агрегат или дерево агрегатов.
Основная цель тактического шаблона агрегирования в DDD - определить границу согласованности, которая технически переводится в границу транзакции.Все, что находится внутри одного агрегата, может измениться при обработке одной команды, но не более.
Агрегат может состоять из нескольких типов объектов.Однако только один тип сущности служит совокупным корнем .Идентификатор корня агрегата является идентификатором для всего агрегата.Другие сущности внутри агрегата будут иметь свои идентификаторы (в противном случае это не сущности, а объекты-значения), но эти сущности нельзя изменять или ссылать непосредственно из-за пределов агрегата, и все операции со всеми сущностями внутри одного агрегата выполняются в корне агрегата.
Наиболее типичным примером агрегата является Order
, где Order
сам (или OrderHead
, если хотите) является корнем, а OrderLine
- сущностью.Вы можете иметь несколько строк заказа для одного заказа, но все операции в любой строке проходят через корень.
Нет прямой и явной связи между совокупным шаблоном и источником событий.Event-Sourcing - это детали реализации.В книге Эрика Эванса даже не упоминается источник событий как таковой, и в нем довольно много примеров агрегатов.
Источник событий - это способ сохранения данных.Фактически, получение событий полностью не связано с DDD, хотя Грег Янг изначально предлагал использовать получение событий как способ сохранения агрегатов путем хранения событий домена.
Когда у вас есть модель чистого домена, она недействительно важно со стороны модели предметной области, какой механизм сохранения вы используете.Многие системы, основанные на событиях, вообще не имеют понятия совокупности.Например, New York Times создала систему управления контентом, основанную на событиях, без учета тактической схемы DDD.С другой стороны, большинство систем, использующих тактические шаблоны DDD, не используют источники событий и используют только постоянство на основе состояния.