DDD. Когда использовать агрегатный корень в древовидной структуре? - PullRequest
0 голосов
/ 28 апреля 2019

В ограниченном контексте я создал Entity, который служит совокупностью для других объектов в этом контексте.Проблема в том, что экземпляр Entity может находиться в отношении «ребенок-родитель» с другим Entity.С точки зрения базы данных это означает, что есть поле parent_id, которое ссылается на строку в той же таблице entities.

И вопрос с точки зрения DDD, можно лиэкземпляр Entity аргумента своей собственной функции конструктора?Или лучше использовать совокупный корень (или идентификатор Entity).Итак, какой путь лучше:

class Entity {
     public constructor (arg1, arg2, Entity parent) {
         ...
         this.setParent(parent);
     }
}

или так:

 class Entity {
     public constructor (arg1, arg2, int parent_id) {
         ...
         this.setParentId(parent_id);
     }
 }

1 Ответ

2 голосов
/ 28 апреля 2019

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

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

  • Один из способов сделать это - иметь Ссылку на объект , как в первом примере

  • Другой способ - использовать Ссылка по идентификатору , как во втором примере

Если вы используете Ссылка на объект , это означает, что вы должны загрузить все объекты, на которые есть ссылки, вместе из БД. Это может привести к тому, что вы загрузите огромное их количество. Если ваше приложение не требует от вас этого, лучше избегать.

Если вы решите использовать Ссылка на объект , тогда вы можете передать Entity Конструктору, как в вашем примере.

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

Вот пример:

public TreeNode {
  public Guid ParentID { get; private set; }
}

public void DoSomethingToNode(Guid nodeId) {

  var node = TreeNodeRepository.GetById(nodeId);
  var parent = TreeNodeRepository.GetById(node.ParentID);

  // do stuff with parent and child.
}

Если вы не читали книгу DDD , я рекомендую ее.

Это эссе Вона Вернона также отлично подходит для моделирования агрегатов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...