DDD、聚合根和实体
DDD, Aggregate roots and Entities
根据 DDD 原则,所有与特定聚合根对象相关的实体的 CRUD 操作都应由聚合根进行。
但是我们如何只更改 aggr 根中的一个实体 属性?我们应该在实体中有 setter 方法吗?这些方法应该有什么访问器?
或者所有实体都应该有一个指向它们聚合根的引用?
或者我们永远不会只更改一个 属性 而是用一个全新的实体代替当前实体状态的实体?
作为一般规则,实体的身份不应在聚合外部可见。更新实体可以通过聚合根轻松完成。 AR 应该有一个方法 changeChildProperty1(newProprty)
或 changeChild(childData)
然后 AR 将决定是更新当前实体还是用新实体替换它。这样做的原因是AR应该负责维护聚合的所有不变量。
更新子实体和值对象应该相对容易。如果在您当前的项目中看起来很难实现,也许您应该重新考虑聚合的设计。有时将其拆分为 2 个不同的聚合更有意义。
According to DDD principles all CRUD operations working with entities related to a specific aggregate root object should be made by the aggregate root.
是;您可以将聚合根视为 role interface,它限制允许应用程序操纵模型的方式。
But how do we change only a single property of an Entity from the aggr root? Should we have setter methods in Entities and what accessors should these methods have ?
聚合是由多个实体组成的事实是一个实现细节。因此,在角色接口的背后,您可以按照自己喜欢的方式委派变更责任。
理想情况下,如果您正在对域模型中的实体的更改建模,则通用语言中应该有相应的词汇表来描述该更改。换句话说,正如我们使用业务语言来描述对聚合根所做的更改一样,我们也使用相同的语言来描述对模型中实体的更改。
因此,"CRUD" 操作往往是实体操纵其自身状态的内部实现细节。当您发现自己达到 get/set 或 create/read/update/delete 时,这表明您正在从域模型过渡到数据模型。
Or we never change only a single property but replace the entity with a totally new one instead with the current entity state?
这可能表明您正在为实体建模,而您应该为值建模。
根据 DDD 原则,所有与特定聚合根对象相关的实体的 CRUD 操作都应由聚合根进行。
但是我们如何只更改 aggr 根中的一个实体 属性?我们应该在实体中有 setter 方法吗?这些方法应该有什么访问器?
或者所有实体都应该有一个指向它们聚合根的引用?
或者我们永远不会只更改一个 属性 而是用一个全新的实体代替当前实体状态的实体?
作为一般规则,实体的身份不应在聚合外部可见。更新实体可以通过聚合根轻松完成。 AR 应该有一个方法 changeChildProperty1(newProprty)
或 changeChild(childData)
然后 AR 将决定是更新当前实体还是用新实体替换它。这样做的原因是AR应该负责维护聚合的所有不变量。
更新子实体和值对象应该相对容易。如果在您当前的项目中看起来很难实现,也许您应该重新考虑聚合的设计。有时将其拆分为 2 个不同的聚合更有意义。
According to DDD principles all CRUD operations working with entities related to a specific aggregate root object should be made by the aggregate root.
是;您可以将聚合根视为 role interface,它限制允许应用程序操纵模型的方式。
But how do we change only a single property of an Entity from the aggr root? Should we have setter methods in Entities and what accessors should these methods have ?
聚合是由多个实体组成的事实是一个实现细节。因此,在角色接口的背后,您可以按照自己喜欢的方式委派变更责任。
理想情况下,如果您正在对域模型中的实体的更改建模,则通用语言中应该有相应的词汇表来描述该更改。换句话说,正如我们使用业务语言来描述对聚合根所做的更改一样,我们也使用相同的语言来描述对模型中实体的更改。
因此,"CRUD" 操作往往是实体操纵其自身状态的内部实现细节。当您发现自己达到 get/set 或 create/read/update/delete 时,这表明您正在从域模型过渡到数据模型。
Or we never change only a single property but replace the entity with a totally new one instead with the current entity state?
这可能表明您正在为实体建模,而您应该为值建模。