实体 类 是否独占一个聚合体

Are entity classes exclusive to one aggregate

读完埃文斯和弗农之后,我仍然有一个基本问题。 我知道当然一个实体(实例)只能在一个聚合中。 但是一个实体 class 可以用于多个聚合 (classes) 吗? 为了澄清,我在 class 级别询问。 其他表述:两个不同的聚合根 classes (!) 可以聚合同一个实体 class 吗?当然,任何实体实例都必须只属于两个聚合根 classes 之一的一个实例。 对于值对象 classes 这似乎是可能的。至少我的印象是 "money" 的值对象 class 可以用于不同的聚合类型。

正如您正确指出的那样,实体 实例 不应在聚合之间共享,因为一个聚合不会意识到通过另一个聚合对实体所做的更改,并且无法'强制执行其不变量。

实体 classes 理论上可以在 2 个聚合之间共享,但是,根据相同的推理,只有当聚合中的实体实例集与另一个。这就提出了问题:

  • 你一开始为什么想要那个?如果有两大类相同class的实例,这不是表明有两个语义不同的概念,它们应该各自有自己的class,或者至少subclass ?

  • 如何防止属于一个聚合的实体实例在运行时(错误)或编程时(未受过教育的开发人员决定)添加到另一个?

值对象避免了这些问题,因为它们通常是不可变的或被视为不可变的——您不修改 VO,而是修改其父实体,使其指向一个全新的 VO 实例。此外,由于值对象没有身份,因此说 "same" VO 同时在两个聚合中没有多大意义。因此,您可以安全地在不同的聚合中重用 VO 类型 classes.

我认为 Udi 的博客 post 非常相关 - 他建议实体不仅可以是多个聚合的一部分,而且本身也可以是聚合根。让你的头脑转过来有点有趣! http://udidahan.com/2009/06/29/dont-create-aggregate-roots/