Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Domain driven design DDD。何时在树状结构中使用聚合根?_Domain Driven Design_Aggregateroot - Fatal编程技术网

Domain driven design DDD。何时在树状结构中使用聚合根?

Domain driven design DDD。何时在树状结构中使用聚合根?,domain-driven-design,aggregateroot,Domain Driven Design,Aggregateroot,在一个有界上下文中,我创建了一个实体,该实体充当此上下文中其他对象的聚合。问题是,实体的一个实例可能与另一个实体存在子-父关系。就数据库而言,这意味着有一个parent\u id字段引用同一实体表中的一行 问题是,从DDD的角度来看,把一个实体的一个实例作为它自己的构造函数的一个参数可以吗?或者最好使用聚合根(或实体标识符)。那么,哪种方式更好: class Entity { public constructor (arg1, arg2, Entity parent) {

在一个有界上下文中,我创建了一个
实体
,该实体充当此上下文中其他对象的聚合。问题是,
实体
的一个实例可能与另一个
实体
存在子-父关系。就数据库而言,这意味着有一个
parent\u id
字段引用同一
实体
表中的一行

问题是,从DDD的角度来看,把一个
实体的一个实例作为它自己的构造函数的一个参数可以吗?或者最好使用聚合根(或
实体
标识符)。那么,哪种方式更好:

class Entity {
     public constructor (arg1, arg2, Entity parent) {
         ...
         this.setParent(parent);
     }
}
或者这样:

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

仅仅因为你有一个树状结构并不意味着这个结构中的所有实体都应该是同一个聚合的一部分

您可以设计您的系统,使每个实体实例在其自身的聚合中。由于每个实体都有一个父实体,因此必须引用该父实体

  • 一种方法是像第一个示例中那样使用对象引用

  • 另一种方法是使用身份引用,如第二个示例所示

如果使用对象引用,则意味着您必须从数据库中加载所有引用的对象。这可能会导致您加载大量的文件。如果您的应用程序不要求您这样做,那么最好避免这样做

如果选择使用对象引用
,则可以像在ecample中一样将实体传递给构造函数

如果使用引用ID,则只能加载一个对象,如果需要,可以使用ID加载另一个对象。如果希望有多个聚合,且这些聚合只在特定情况下相互需要,并且不需要一直同时加载,因为应用程序不需要这样做,则这非常有用

下面是一个例子:

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.
}
如果你还没有读过这本书,我建议你读一下


对聚合建模也很有帮助,仅仅因为有树状结构并不意味着此结构中的所有实体都应该是相同的聚合的一部分

您可以设计您的系统,使每个实体实例在其自身的聚合中。由于每个实体都有一个父实体,因此必须引用该父实体

  • 一种方法是像第一个示例中那样使用对象引用

  • 另一种方法是使用身份引用,如第二个示例所示

如果使用对象引用,则意味着您必须从数据库中加载所有引用的对象。这可能会导致您加载大量的文件。如果您的应用程序不要求您这样做,那么最好避免这样做

如果选择使用对象引用
,则可以像在ecample中一样将实体传递给构造函数

如果使用引用ID,则只能加载一个对象,如果需要,可以使用ID加载另一个对象。如果希望有多个聚合,且这些聚合只在特定情况下相互需要,并且不需要一直同时加载,因为应用程序不需要这样做,则这非常有用

下面是一个例子:

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.
}
如果你还没有读过这本书,我建议你读一下


对聚合建模也很好

一般来说,原始痴迷是不好的。什么是域术语中的int?@graememeller。所以,就纯理论而言,存储对另一个聚合的引用并将其用作参数是可以的?一般来说,原始的困扰是不好的。什么是域术语中的int?@graememeller。所以,从纯理论的角度来说,存储对另一个聚合的引用并将其用作参数是可以的?