Должен ли один корень быть для всего агрегированного графа или несколько корней должны быть в одном графе?
Это зависит.
Более важный момент: он очень мало зависит от структуры отношений между сущностями домена.
Определение совокупных границ в первую очередь связано с тем, как изменяется состояние объектов; в частности, если любое из этих изменений требует одновременной координации между двумя объектами.
Объединение сущностей в единую совокупность упрощает координацию изменений, но это сопряжено с затратами - вы больше не можете вносить независимые параллельные изменения в сущности. Независимые правки либо должны блокировать ожидание друг друга, либо один пересчет необходимо будет пересчитать.
Разделение сущностей на отдельные агрегаты значительно упрощает параллельное редактирование, но при этом становится сложнее координировать изменения между сущностями.
Один агрегат действительно хочет иметь одно хранилище - попытка координировать записи в двух разных местах (так называемая двухфазная фиксация) - это перетаскивание. Если два объекта принадлежат разным агрегатам, модель подразумевает, что они могут храниться в отдельных устройствах.
Также предполагается, что они имеют независимые жизненные циклы - одно из преимуществ агрегатов заключается в четком понимании графа объектов, которые архивируются вместе.
Еще одна вещь, которую нужно проверить, это то, является ли ваш объектный граф несколькими сущностями или единственной записью с составным значением, описывающим его состояние. Если это может быть одно значение, то это значит, что сначала нужно попробовать один агрегат.
Вы также можете посмотреть на источник данных - особенно источники изменений во времени. Если изменения всегда исходят из одних и тех же авторитетов, то, скорее всего, это будет один агрегат. С другой стороны, если данные WorktimeRegulation
и Worktime
поступают из разных источников, это повышает вероятность одновременных изменений, что намекает на несколько агрегатов.
Важный вопрос для изучения: какова стоимость бизнеса, если предприятия не в точном согласии? Если данные, хранящиеся в Worktime, в течение минуты не согласуются с WorktimeRegulation, кто-нибудь замечает? Случаи, когда у вас есть некоторая свобода выстраивать порядок вещей, когда вы можете гибко определять порядок внесения изменений, имеют тенденцию к множественным агрегатам.
Два агрегата WorkTime - это ребенок в обоих из них
Каждая сущность в вашей модели должна принадлежать ровно одному агрегату; теоретически можно иметь WorkTime внутри WorktimeRegulation и WorkTime внутри WorktimeActivation, но иметь то же самое рабочее время внутри агрегата WorktimeRegulation и внутри агрегата WorktimeActivation - "против правила". Это подразумевает, что либо изменения WorktimeActivation могут повлиять на WorktimeRegulation, либо сам WorkTime является чем-то, что следует разбить на две отдельные части.