DDD(领域驱动设计),聚合根和实体

4
根据DDD原则,所有与特定聚合根对象相关的实体的CRUD操作都应由聚合根执行。
但是如何仅更改聚合根中实体的单个属性?我们是否应该在实体中拥有setter方法,并且这些方法应具有哪些访问器?
或者所有实体都应该在自身中具有一个指向其聚合根的引用?
或者我们从不仅更改单个属性,而是将实体替换为具有当前实体状态的全新实体?
2个回答

8
根据DDD原则,与特定聚合根对象相关的所有CRUD操作都应由聚合根执行。是的,您可以将聚合根视为角色接口,以限制应用程序允许操作模型的方式。但是,我们如何仅更改聚合根中的单个实体属性?我们应该在实体中拥有setter方法,这些方法应该具有哪些访问器?事实上,聚合是由多个实体组成的实现细节。因此,在角色接口后面,您可以按任何喜欢的方式委托更改的责任。理想情况下,如果您正在对领域模型中的实体进行建模,则应该在普遍语言中描述相应的词汇表来描述更改。换句话说,就像我们使用业务语言来描述对聚合根所做的更改一样,我们也使用相同的语言来描述模型内部实体的更改。
“CRUD”操作通常是实体操纵其自身状态的内部实现细节。当你需要使用get/set或create/read/update/delete时,这就提示你正在从域模型转向数据模型。
“或者我们不仅更改单个属性,而是用当前实体状态完全替换实体?”这可能意味着你正在建模一个应该建模为值的实体。

1
作为一般规则,实体的身份不应在聚合体外可见。通过聚合根可以轻松地更新实体。AR 应该有一个方法 changeChildProperty1(newProprty)changeChild(childData),然后 AR 将决定是更新当前实体还是用新实体替换它。原因在于,AR 应负责维护聚合体的所有不变量。
更新子实体和值对象应该相对容易。如果在您当前的项目中看起来很难实现,也许您应该重新考虑聚合的设计。有时将其拆分为 2 个不同的聚合体更加合理。

是的,但是 changeChildProperty1(newProprty) 是做什么的?它是否使用了 Entity 的 .SetChildProperty1 方法 - 一个属于 Entity 类的方法并且可以访问它? - Ivelin Matev
1
可以只调用实体的setter方法。AR可以访问其所有相关实体。 - Mohamed Bouallegue

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接