在一对一相关域聚合之间使用共享 ID

Using shared IDs among one-to-one related domain aggregates

将共享 GUID 用作具有一对一关系的根聚合的聚合 ID 是一种合理的模式吗?

除了清楚之外,我没有立即看到任何不这样做的理由。

例如,我有一个 Organization Membership 限界上下文,其核心关注聚合根是一个 Member。会员聚合包含与会员相关的数据,以及对相关人员聚合(包含姓名、生日等)和网站用户(EF 身份)聚合的引用。

我最初的想法是做这样的事情,其中​​每个聚合根都包含对相关聚合根的引用:

public class Member : AggregateRoot
{
    Guid Id;            // (Each aggregate ID is inherited)
    Guid PersonId;

}

public class Person : AggregateRoot
{
    Guid Id;
    Guid UserId;
}

public class User : IdentityUser, IAggregateRoot
{
    Guid Id;
}

通过以下方式完成获得会员的身份:

var person = personRepository.GetById(member.PersonId);

然后我想到,如果我在成员、个人和用户名中使用相同的 ID,我可以 "simplify" 事情,然后使用检索相关聚合,例如:

var person = personRepository.GetById(member.Id)

这只是一个细微的差别,我最初对这个想法很满意,但现在变得谨慎起来。这是不是一个坏主意,因为它掩盖了关系?

你可以这样做,但你会使显式隐式化,这是一件坏事。这些实体使用相同 ID 的事实将被隐藏,只有在应用程序服务中才能找到此知识。这有点像领域知识泄露到外面。另外,限界上下文之间的关系是隐藏的,你不会知道什么是上游什么是下游。时间依赖性也丢失了:首先创建什么,PersonUser?

如果您需要了解此内容,只需在您首选的搜索引擎上搜索 "make the implicit explicit software development"。以防万一您的结果不同,您应该阅读 this.

P.S。为所有实体共享相同的 value 也不错。