DDD中的聚合对象

时间:2012-02-17 15:25:26

标签: java java-ee domain-driven-design

我可以在其他类中使用相同的聚合类作为成员吗? 如果是,那么包含聚合的类会强制执行访问等吗?

假设您有一个User类。然后是一个名为LogBook的类,最后是一个名为Log / Post的类(在那个小巷里面)。 LogBook将是Log / Post类的聚合根,而User将是我示例中的整体聚合。现在,User类是否包含添加日志帖子的方法等?您可以在User类中创建一个调用LogBook类的方法,该类具有执行实际添加日志的所有逻辑的方法。

或者,总体上是一个聚合总体吗?没有嵌套。

2 个答案:

答案 0 :(得分:1)

这是一个很好的definition聚合:

  

定义:被视为一个单元的关联对象的集群   出于数据更改的目的。外部参考仅限于   Aggregate的一个成员,指定为root。一套   一致性规则适用于Aggregate的边界。问题:   很难保证对象变化的一致性   具有复杂关联的模型。需要维护不变量   适用于密切相关的对象组,而不仅仅是离散的   对象。然而,谨慎的锁定方案会导致多个用户   相互干扰毫无意义,使系统无法使用。   [DDD,p。 126]解决方案:将实体和值对象聚类到   聚合并定义每个边界。选择一个实体   每个聚合的根,并控制对对象的所有访问   在通过根的边界内。允许外部对象保持   仅引用root。对内部成员的瞬时引用   可以在一次操作中传递出来使用。因为   root控件访问,它不能被改变所蒙蔽   内部。这种安排使得所有人都可以实施   聚合中的对象和聚合中的对象的不变量   整个在任何状态的变化。 [DDD,p。 129]

我认为您不希望User类在不经过LogBook类的情况下进入LogBook的聚合对象。但是,从用户访问LogBook似乎没问题。

答案 1 :(得分:0)

我认为聚合的内部允许持有对其他聚合的 root 的引用。但是每个聚合都负责执行自己的边界。没有什么可以阻止其他对象完全访问第一个聚合之外的“引用”聚合 - 也就是说我不认为嵌套或所有权只是因为一个聚合引用了另一个聚合。

在您的示例中,似乎LogBook更适合作为聚合,控制对帖子的访问。试图将其变成一个更大的用户聚合似乎是一个尴尬的责任因素。