12

我有两个聚合根和两个非聚合根实体:

实体关系

我知道,这种关系D -> B违反了 DDD 原则。

我听说,在大多数情况下,解决方案是使引用的实体成为新的聚合根。

但是,如果B 是A的真正孩子(B 不能没有 A),那么让 B 成为一个新的聚合根真的是一种选择吗?

4

2 回答 2

2

我同意你的观点,有时将一个实体与其集合分开是没有意义的,因为它是如此自然地融入其中。这就是为什么我没有完全接受某些人推荐的“小聚合”方法的原因之一。

在这种情况下,您可以做的是通过遍历 A 的实例来获取对 B 的引用,而不是直接获取它。毕竟,如果 B 没有 A 就不能存在,那么聚合之外的对象就没有理由知道某个特定的 B 而不知道它的 A。

于 2012-11-15T13:08:00.123 回答
1

首先,这不是 DDD 思维,这是 RDBMS 思维。在 DDD 中,您可以像在现实世界中一样对业务流程进行建模,您没有一对多等概念。所以忘记数据库、外键等等。

你的有界上下文(BC)是什么?每个聚合本身就是一个 BC,因此即使它们的名称相同,它们也可以对概念有不同的表示。

如果我正确理解,似乎 ABCD 是单个聚合的一部分。这并不意味着它们仅在该聚合中且仅在该形式中定义。但是,如果 C 在其他一些 BC 中是完全成熟的 AR,那么在此上下文中很可能仅表示为 id 或一些属性(接口对于这些东西非常方便)。因此,即使它们都被命名为 C,它们也是不同的,只有特定上下文所需的行为。

DDD 适用于许多 BC,模型仅对一个 BC 有效。这意味着在您的应用程序中,您将根据每个 BC 有多个 A 、B 、C 定义,并且每个定义可能略有不同。这意味着实际上并不只有一种模型适用于所有情况(我在这里不是在谈论 CQRS,只是在谈论 DDD)。

我对这个领域了解不多,实际上想出更具体的东西。但简而言之,尝试以事物的本来面目和实际工作的方式表示事物。

于 2012-11-17T11:18:56.327 回答