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


Я пытаюсь понять, как правильно использовать шаблон репозитория. Центральная концепция совокупного корня продолжает появляться. При поиске как в интернете, так и в Stack Overflow для справки о том, что такое aggregate root, я продолжаю находить обсуждения о них и мертвые ссылки на страницы, которые должны содержать базовые определения.

в контексте шаблона репозитория, что такое совокупный корень?

10 355

10 ответов:

в контексте шаблона репозитория aggregate roots-это единственные объекты, которые клиентский код загружает из репозитория.

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

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

от Эванса DDD:

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

и:

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

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

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

Aggregate root-это сложное имя для простой идеи.


общая идея

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

enter image description here

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


пример

проверьте этот простой класс иерархия enter image description here

как вы хотите ездить на машине? Выбрал лучший api

вариант а (он просто как-то работает):

car.ride();

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

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

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


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

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

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

рассмотрим Aggregate Root как точку входа в Aggregate.

В C# код:

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 (не имеет идентификатора самостоятельно), рассмотрим его только в качестве примера.

Если вы следуете первому подходу к базе данных, вы агрегируете root, как правило, таблицу на стороне 1 отношения 1-many.

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

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

  1. клиенты
  2. продавцы

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

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

Они заботятся о клиенте и продавце репозитория соответственно.

с битая ссылка:

внутри агрегата есть агрегатный корень. Корень агрегата является родительской сущностью для всех других сущностей и объектов значений в агрегате.

репозиторий работает с корнем Aggregate.

дополнительная информация также может быть найдена здесь.

Дайна:

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

enter image description here

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

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

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