1

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

除了清晰之外,我没有立即看到任何理由。

例如,我有一个组织成员有界上下文,其核心关注聚合根是成员。会员聚合包含会员相关数据,以及对相关个人聚合(包含姓名、出生日期等)和网站用户(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,我可以“简化”事情,然后使用例如检索相关聚合:

var person = personRepository.GetById(member.Id)

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

4

1 回答 1

0

你可以这样做,但你会使显式隐含,这是一件坏事。这些实体使用相同 ID 的事实将被隐藏,只有在应用程序服务中才能找到此知识。这种感觉就像领域知识正在向外泄漏。此外,有界上下文之间的关系是隐藏的,你不会知道什么是上游,什么是下游。时间依赖性也丢失了:首先创建什么, aPerson还是 a User

如果您需要了解这一点,只需在您喜欢的搜索引擎上搜索“进行隐式显式软件开发”即可。以防万一您的结果不同,您应该阅读内容。

PS 为所有实体共享相同的也不错。

于 2018-01-07T03:50:30.313 回答