То, что у вас есть древовидная структура, не означает, что все сущности в этой структуре должны быть частью одной совокупности .
Вы можете спроектировать свою систему так, чтобы каждый экземпляр сущности находился в отдельном агрегате. Поскольку у каждой сущности есть родитель, вы должны ссылаться на этого родителя.
Один из способов сделать это - иметь Ссылку на объект , как в первом примере
Другой способ - использовать Ссылка по идентификатору , как во втором примере
Если вы используете Ссылка на объект , это означает, что вы должны загрузить все объекты, на которые есть ссылки, вместе из БД. Это может привести к тому, что вы загрузите огромное их количество. Если ваше приложение не требует от вас этого, лучше избегать.
Если вы решите использовать Ссылка на объект , тогда вы можете передать 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 , я рекомендую ее.
Это эссе Вона Вернона также отлично подходит для моделирования агрегатов