假设我有两个有界上下文,Billing和Shipping。
在计费限制上下文中,我有这样的:
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将来自用户模型。
除了accountId和receiventId之外,我还需要在这些模型中添加一个名为$userId的字段吗?
从DDD的角度来看,应该将字段userId
添加到Account
和Recipient
。
原因是Recipient
、Account
和User
是实体。这意味着他们应该有自己的身份。即使您的User
始终只有一个Account
,也不意味着User
是Account
,因此它们不能共享相同的id。
此外,最好从一开始就为一个用户拥有多个帐户。假设用户决定删除他的帐户。在这种情况下,我想你不应该删除他过去的订单,所以你不应该移除User
本身。您应该仅删除用户的Account
。
如果将来,同一个用户决定创建一个新的Account
,那么您可以创建一个全新的,并在数据库中拥有一个旧的未激活帐户和一个新活动帐户。
然而,我可以想象,当你出于某种原因决定对这些实体使用相同的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;
}
是的,将user上下文中的用户id引用为其他上下文中的某些外部id(此处为Account和Recipient实体(是一种有效的方法。
您甚至可以考虑是否使用一些自定义的值对象类来表示其他上下文中的用户引用。这样,您就可以对用户的引用进行强键入,而不是简单地使用字符串。