【发布时间】:2015-03-04 11:51:35
【问题描述】:
在阅读了 Evans 和 Vernon 之后,我还有一个基本问题。 我知道当然一个实体(实例)只能在一个聚合中。 但是一个实体类可以在多个聚合(类)中使用吗? 为了澄清,我在课堂上问。 其他表述:两个不同的聚合根类(!)可以聚合同一个实体类吗?当然,任何实体实例都必须只属于两个聚合根类之一的一个实例。 对于值对象类,这似乎是可能的。至少我的印象是,例如“金钱”的值对象类可以用于不同的聚合类型。
【问题讨论】:
在阅读了 Evans 和 Vernon 之后,我还有一个基本问题。 我知道当然一个实体(实例)只能在一个聚合中。 但是一个实体类可以在多个聚合(类)中使用吗? 为了澄清,我在课堂上问。 其他表述:两个不同的聚合根类(!)可以聚合同一个实体类吗?当然,任何实体实例都必须只属于两个聚合根类之一的一个实例。 对于值对象类,这似乎是可能的。至少我的印象是,例如“金钱”的值对象类可以用于不同的聚合类型。
【问题讨论】:
正如您正确指出的那样,实体实例不应该在聚合之间共享,因为一个聚合不会知道通过另一个聚合对实体所做的更改,并且无法强制执行其不变量.
实体类理论上可以在 2 个聚合之间共享,但是,根据相同的推理,只有当聚合中的实体实例集与另一个不相交时。这引发了一些问题:
你为什么首先想要那个?如果同一个类的实例有两大类,这不是说明存在两个语义不同的概念,每个概念都应该有自己的类,或者至少是子类吗?
如何防止在运行时(错误)或编程时(未受过教育的开发人员决策)将属于一个聚合的实体实例添加到另一个聚合中?
值对象避免了这些问题,因为它们通常是不可变的或被视为不可变的——你不修改一个 VO,你修改它的父实体,以便它指向一个全新的 VO 实例。此外,由于值对象没有标识,因此说“相同”的 VO 同时存在于两个聚合中也没有多大意义。因此,您可以在不同的聚合类中安全地重用 VO 类型。
【讨论】:
我认为 Udi 的博文非常相关 - 他建议实体不仅可以是多个聚合的一部分,而且本身也可以是聚合根。让你的脑袋转转有点有趣! http://udidahan.com/2009/06/29/dont-create-aggregate-roots/
【讨论】: