Hol*_*ann 5 domain-driven-design
在阅读了埃文斯和弗农之后,我还有一个基本的问题。我知道,一个实体(实例)当然只能处于一个集合中。但是实体类可以用于多个聚合(类)吗?为了澄清起见,我在课堂上问。其他公式:两个不同的聚合根类(!)可以聚合同一实体类吗?当然,任何实体实例都必须仅属于两个聚合根类之一的一个实例。对于值对象类,这似乎是可能的。至少我的印象是,例如“ money”的值对象类可以用于不同的聚合类型。
正如您正确指出的那样,实体实例不应在聚合之间共享,因为一个聚合不会意识到通过另一个聚合对实体所做的更改并且无法强制执行其不变量。
理论上,实体类可以在 2 个聚合之间共享,但是,出于同样的原因,前提是聚合中的实体实例集彼此不相交。这提出了问题:
为什么你首先想要那个?如果同一个类有两大类实例,这是否表明存在两个语义不同的概念,每个概念都应该有自己的类,或者至少是子类?
您如何防止属于一个聚合的实体实例在运行时(错误)或在编程时(未受过教育的开发人员决定)添加到另一个聚合中?
值对象避免了这些问题,因为它们通常是不可变的或被视为不可变的——您不修改 VO,而是修改其父实体,使其指向一个全新的 VO 实例。此外,由于值对象没有标识,因此说“相同”的 VO 同时位于两个聚合中没有多大意义。因此,您可以在不同的聚合类中安全地重用 VO 类型。