我需要一些有关管理 DDD 中实体标识符的说明。
假设我们有
Product
模型。它在 Sales context
、Shipping context
和 Inventory context
中可以有不同的含义。所以我们可以根据 DDD 为每个上下文建立不同的模型。
假设我使用
Guid
作为实体的标识符。当我使用 Guid
创建产品时,它是否应该使用相同的 Guid 在其他两个上下文中创建实例?或者我们应该在每种情况下使用不同的 Guid
?
如果我们要在不同的上下文中使用不同的 ID,我们如何知道
Shipping context
中的哪个产品与 Sales context
中的产品相关?由于我们在每个上下文中使用不同的 ID,如何在不同的上下文之间识别相同的产品?
您应该在所有限界上下文中共享 ID。无论是他们的PK还是一些追踪领域。 (最好用PK)。
如果我们这样做,那么我们就引入了有界上下文的耦合。不是 是吗?
是的,但并不是所有的耦合都是不好的,相反,有些耦合是必要的。但您必须了解
product
生命周期。谁创建、修改和删除它? product
上的任何更改是否会影响每个有界上下文?对生命周期有一个清晰的认识,否则,你最终会陷入一团糟。
注意: 如果修改
product
对其他有界上下文有副作用,那么我们在所有有界上下文之间共享一个状态,因为:
总而言之,复制数据降低了耦合性,但使设计变得更加复杂(使所有数据保持最新),并带来更多验证问题(我们是否复制了事实来源?)。