Что такое совокупный корень?

Я пытаюсь понять, как правильно использовать шаблон репозитория. Центральная концепция "Агрегатного корня" продолжает расти. При поиске как в Интернете, так и в Qaru для получения справки о том, что представляет собой совокупный корень, я продолжаю находить обсуждения о них и мертвые ссылки на страницы, которые должны содержать базовые определения.

В контексте шаблона репозитория , что является агрегированным корнем?

Ответ 1

В контексте шаблона репозитория совокупные корни являются единственными объектами, которые ваш клиентский код загружает из репозитория.

Репозиторий инкапсулирует доступ к дочерним объектам - с точки зрения вызывающего абонента он автоматически загружает их, либо в то же время, когда загружается корень, либо когда они действительно нужны (как при ленивой загрузке).

Например, у вас может быть объект Order, который инкапсулирует операции с несколькими объектами LineItem. Ваш клиентский код никогда не будет загружать объекты LineItem напрямую, а только Order, который их содержит, который будет являться агрегирующим корнем для этой части вашего домена.

Ответ 2

От Evans DDD:

AGGREGATE - это кластер связанных объектов, которые мы рассматриваем как единицу с целью изменения данных. Каждый AGGREGATE имеет корень и границу. Граница определяет, что находится внутри AGGREGATE. Корень - это единственный, определенный ENTITY, содержащийся в AGGREGATE.

и

Корень является единственным членом AGGREGATE, что внешним объектам разрешено удерживать ссылки на [.]

Это означает, что совокупные корни являются единственными объектами, которые могут быть загружены из репозитория.

Пример - это модель, содержащая объект Customer и объект Address. Мы никогда не будем обращаться к объекту Address непосредственно из модели, поскольку это не имеет смысла без контекста ассоциированного Customer. Таким образом, мы могли бы сказать, что Customer и Address вместе образуют совокупность и что Customer является совокупным корнем.

Ответ 3

Агрегатный корень - сложное имя для простой идеи.


Общая идея

Хорошо разработанная диаграмма классов инкапсулирует ее внутренности. Точка, через которую вы получаете доступ к этой структуре, называется aggregate root.

введите описание изображения здесь

Внутренние части вашего решения могут быть очень сложными, но пользователь этой иерархии будет просто использовать root.doSomethingWhichHasBusinessMeaning().


Пример

Проверьте эту простую иерархию классов введите описание изображения здесь

Как вы хотите покататься на своем автомобиле? Выберите лучше api

Вариант A (он как-то работает):

car.ride();

Вариант B (пользователь имеет доступ к классам inernals):

if(car.getTires().getUsageLevel()< Car.ACCEPTABLE_TIRE_USAGE)
    for (Wheel w: car:getWheels()){
        w.spin();
    }
}

Если вы считаете, что вариант A лучше, то поздравления. Вы получаете основную причину aggregate root.


Агрегированный корень инкапсулирует несколько классов. вы можете манипулировать всей иерархией только через главный объект.

Ответ 4

Представьте, что у вас есть компьютерный объект, этот объект также не может жить без его объекта Software и аппаратного обеспечения. Они образуют агрегат Computer, мини-экосистему для компьютерной части домена.

Агрегированный корень является материнским сущностью внутри совокупности (в нашем случае Computer), распространенная практика заключается в том, что ваш репозиторий работает только с сущностями, являющимися агрегированными корнями, и этот объект отвечает за инициализацию других объектов.

Рассмотрим совокупный корень в качестве точки входа в совокупность.

В коде С#:

public class Computer : IEntity, IAggregateRoot
{
    public Hardware Hardware { get; set; }
    public Software Software { get; set; }
}

public class Hardware : IEntity { }
public class Software : IValueObject { }

public class Repository<T> : IRepository<T> where T : IAggregateRoot {}

Имейте в виду, что аппаратное обеспечение, скорее всего, будет ValueObject тоже (не имеет собственного идентификатора), рассмотрите его только как пример.

Ответ 5

Если вы придерживаетесь подхода, основанного на базе данных, вы объединяете корень, как правило, это таблица с 1 стороны отношения 1-много.

Наиболее распространенным примером является Person. У каждого человека много адресов, один или несколько платежных ведомостей, счета-фактуры, записи в CRM и т.д. Это не всегда так, но в 9/10 раз.

В настоящее время мы работаем над платформой для электронной коммерции, и у нас в основном есть два совокупных корня:

  • Клиенты
  • Продавцы

Клиенты поставляют контактную информацию, мы присваиваем им транзакции, транзакции получают позиции и т.д.

Продавцы продают продукты, имеют контакт с людьми, о нас, о специальных предложениях и т.д.

Об этом заботятся репозитарий Клиента и Продавца соответственно.

Ответ 6

Из неработающая ссылка:

Внутри агрегата есть сводный корень. Агрегатный корень является родительским Entity ко всем другим объектам и объектам Value в агрегате.

Репозиторий работает на основе совокупного корня.

Более подробную информацию можно найти здесь.

Ответ 7

Дин:

В контексте репозитория Агрегатный корень является сущностью без родительской сущности. Он содержит нуль, одно или много дочерних объектов, существование которых зависит от родителя для его идентичности. Это отношение "Один ко многим" в репозитории. Эти дочерние объекты представляют собой простые агрегаты.

введите описание изображения здесь

Ответ 8

В Erlang нет необходимости проводить различие между агрегатами, как только совокупность составлена ​​структурами данных внутри состояния, а не OO-композиция. Пример: https://github.com/bryanhunter/cqrs-with-erlang/tree/ndc-london

Ответ 9

Агрегат означает сбор чего-то.
root похож на верхний node дерева, откуда мы можем получить доступ ко всему, как <html> node в документе веб-страницы.
Blog Analogy, пользователь может иметь много сообщений, и каждый пост может иметь много комментариев. поэтому, если мы выберем любого пользователя, тогда он может действовать как root, чтобы получить доступ ко всем связанным сообщениям и дополнительным комментариям этих сообщений. Все они вместе называются коллекциями или Агрегированные

Ответ 10

Агрегат - это то, где вы защищаете свои инварианты и согласованность усилий, ограничивая свой общий доступ к ресурсу. Не забывайте, что агрегат должен разрабатывать ваши бизнес-правила и инварианты вашего проекта, а не отношения к базе данных. вам не следует вводить какой-либо репозиторий, и запросы не допускаются.