2017-10-10 277 views
1

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

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

或者可能所有的实体都应该有自己的引用来指向它们的聚合根?

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

回答

4

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

是的;你可以认为聚合根是一个role interface,它约束了应用程序被允许操作模型的方式。

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

聚合是由多个实体组成的事实是一个实现细节。所以在角色界面后面,您可以按照自己喜欢的方式委派变更的职责。理想情况下,如果您在领域模型中为实体建模时发生变化,则无处不在的语言中应该有相应的词汇表来描述变化。换句话说,正如我们使用业务语言描述对聚合根进行的更改一样,我们也使用相同的语言来描述对模型中实体的更改。

因此,“CRUD”操作倾向于操作其自身状态的实体的内部实现细节。当您发现自己正在获取/设置或创建/读取/更新/删除时,这意味着您正在从域模型跨越到数据模型。

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

这可能表明您正在建模一个实体,您应该在其中建模一个值。

1

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

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

+0

是的,但changeChildProperty1(newProprty)是做什么的?它是使用某种。实体的SetChildProperty1 - 属于实体类的方法,并且有权访问它? –

+1

是的,它可以只是调用实体的setter。 AR可以访问其所有相关实体。 –