假设我有两个边界上下文:“计费”和“发货”。
在计费边界上下文中,我有这个:
class Account {
private $id;
private $address;
private $zipCode;
private $city;
private $postbox;
}
在运输边界上下文中,我有这个:
class Recipient {
private $id;
private $address;
private $zipCode;
private $city;
private $doorCode;
}
所以现在,众所周知,这两个模型与其他边界上下文中的另一个用户相关。
如果帐户和收件人共享相同的 ID,并且此 ID 将来自用户模型。
除了帐户 ID 和收件人 ID 之外,我是否还必须在这些模型中添加一个名为 $userId 的字段?
从 DDD 的角度来看,您应该将字段 userId
添加到“帐户
”和“收件人
”。
原因是收件人
、帐户
和用户
是实体。这意味着他们应该有自己的身份。即使您的用户始终
只有一个帐户,也不意味着该用户
是帐户
,因此他们不能共享相同的ID。
此外,从一开始就有可能为一个用户拥有多个帐户可能会更好。假设用户决定删除其帐户。在这种情况下,我想你不应该删除他过去的订单,所以你不应该删除用户
本身。您应该只删除用户的帐户
。
如果将来同一用户决定创建一个新帐户,则可以创建一个新帐户,并在数据库中拥有一个旧的停用帐户和一个新的活动帐户
。
但是,我可以想象当您出于某种原因决定对这些实体使用相同的 Id 时的设计,即使它不太符合 DDD 原则。但是,如果您决定这样做,最好为 id 字段使用清晰的名称。而不仅仅是:
class Account {
private $id;
private $address;
}
你最好有:
class Account {
private $userId; // if it's userId we should express it explicitly in the name
private $address;
}
是的,将用户上下文中的用户 ID 引用为其他上下文中的某个外部 ID(此处在帐户和收件人实体中)是一种有效的方法。
您甚至可以考虑是否使用一些自定义值对象类来表示其他上下文中的用户引用。有了它,您可以对用户的引用进行强类型化,而不是简单地使用字符串。