根据DDD原则,与特定聚合根对象相关的实体的所有CRUD操作都应由聚合根进行。
但是我们如何从aggr根只更改实体的单个属性?我们是否应该在实体中设置setter方法以及这些方法应该具有哪些访问器?
或者可能是所有实体都应该在他们自己指向聚合根的情况下引用?
或者我们从不更改单个属性,而是使用全新的实体替换实体而不是当前的实体状态?
答案 0 :(得分:4)
根据DDD原则,与特定聚合根对象相关的实体的所有CRUD操作都应由聚合根进行。
是;您可以认为聚合根是role interface,它限制了应用程序如何操作模型。
但是我们如何从aggr根只更改实体的单个属性?我们是否应该在实体中设置setter方法以及这些方法应该具有哪些访问器?
聚合由多个实体组成的事实是一个实现细节。因此,在角色界面后面,您可以按照自己喜欢的方式委派更改的职责。
理想情况下,如果您要对域模型中的实体进行建模更改,则应该在无处不在的语言中描述相应的词汇表来描述更改。换句话说,正如我们使用业务语言来描述对聚合根所做的更改一样,我们也使用相同的语言来描述模型中实体的更改。
" CRUD"因此,操作往往是操纵其自身状态的实体的内部实现细节。当您发现自己达到获取/设置,或创建/读取/更新/删除时,这表明您正在从域模型跨越到数据模型。
或者我们永远不会只改变一个属性,而是用一个全新的实体替换当前的实体状态?
这可能表明您正在建模一个您应该为值建模的实体。
答案 1 :(得分:1)
作为一般规则,实体的身份不应在聚合之外可见。聚合根可以轻松完成更新实体。 AR应该有一个方法changeChildProperty1(newProprty)
或changeChild(childData)
,然后AR将决定更新当前实体还是用新实体替换它。这样做的原因是AR应该负责维护聚合的所有不变量。
更新子实体和值对象应该相对容易。如果在您当前的项目中看起来很难实现,那么您应该重新考虑聚合的设计。有时将它分成两个不同的聚合更有意义。