DDD,聚合根和实体

时间:2017-10-10 08:06:55

标签: c# domain-driven-design aggregateroot

根据DDD原则,与特定聚合根对象相关的实体的所有CRUD操作都应由聚合根进行。

但是我们如何从aggr根只更改实体的单个属性?我们是否应该在实体中设置setter方法以及这些方法应该具有哪些访问器?

或者可能是所有实体都应该在他们自己指向聚合根的情况下引用?

或者我们从不更改单个属性,而是使用全新的实体替换实体而不是当前的实体状态?

2 个答案:

答案 0 :(得分:4)

  

根据DDD原则,与特定聚合根对象相关的实体的所有CRUD操作都应由聚合根进行。

是;您可以认为聚合根是role interface,它限制了应用程序如何操作模型。

  

但是我们如何从aggr根只更改实体的单个属性?我们是否应该在实体中设置setter方法以及这些方法应该具有哪些访问器?

聚合由多个实体组成的事实是一个实现细节。因此,在角色界面后面,您可以按照自己喜欢的方式委派更改的职责。

理想情况下,如果您要对域模型中的实体进行建模更改,则应该在无处不在的语言中描述相应的词汇表来描述更改。换句话说,正如我们使用业务语言来描述对聚合根所做的更改一样,我们也使用相同的语言来描述模型中实体的更改。

" CRUD"因此,操作往往是操纵其自身状态的实体的内部实现细节。当您发现自己达到获取/设置,或创建/读取/更新/删除时,这表明您正在从域模型跨越到数据模型。

  

或者我们永远不会只改变一个属性,而是用一个全新的实体替换当前的实体状态?

这可能表明您正在建模一个您应该为值建模的实体。

答案 1 :(得分:1)

作为一般规则,实体的身份不应在聚合之外可见。聚合根可以轻松完成更新实体。 AR应该有一个方法changeChildProperty1(newProprty)changeChild(childData),然后AR将决定更新当前实体还是用新实体替换它。这样做的原因是AR应该负责维护聚合的所有不变量。

更新子实体和值对象应该相对容易。如果在您当前的项目中看起来很难实现,那么您应该重新考虑聚合的设计。有时将它分成两个不同的聚合更有意义。