读完埃文斯和弗农后,我还有一个基本问题。 我知道当然一个实体(实例)只能在一个聚合中。 但是实体类可以用在多个聚合(类)中吗? 为了澄清,我在课堂上问。 其他公式:两个不同的聚合根类(!)可以聚合相同的实体类吗?当然,任何实体实例都必须只属于两个聚合根类之一的一个实例。 对于Value Object类,这似乎是可能的。至少我的印象是,例如“money”的值对象类可以用于不同的聚合类型。
答案 0 :(得分:4)
正如您正确指出的那样,实体实例不应该在聚合之间共享,因为一个聚合体不会意识到通过另一个聚合所做的实体的更改并且无法&# 39;强制执行其不变量。
实体类理论上可以在2个聚合之间共享,但是,只有当聚合中的实体实例集与另一个实体实例不相交时,才能通过相同的推理。这提出了一些问题:
你为什么要首先想要这个?如果同一类的实例有两大类,那么这是否有两个语义不同的概念,每个概念应该有自己的类,或者至少是子类?
如何防止属于一个聚合的实体实例在运行时(错误)或编程时(未经过培训的开发人员决定)被添加到另一个聚合?
Value Objects逃避了这些问题,因为它们通常是不可变的或被视为这样 - 您不修改VO,修改其父实体以使其指向一个全新的VO实例。此外,由于价值对象没有身份,因此说同一个"相同的"并不是很有意义。 VO同时包含两个聚合。因此,您可以安全地在不同的聚合类中重用VO类型。
答案 1 :(得分:0)
我认为Udi在这里的博客文章非常相关-他建议实体不仅可以是多个聚合的一部分,而且可以自身成为聚合根。让你的头转起来有点有趣! http://udidahan.com/2009/06/29/dont-create-aggregate-roots/