将共享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)
这只是一个小小的差异,我最初对这个想法很满意,但现在变得谨慎了。这是一个坏主意,因为它掩盖了这种关系?
答案 0 :(得分:0)
你可以这样做,但你会明确隐含这是一件坏事。这些实体使用相同ID的事实将被隐藏,只有在应用程序服务中才能找到这种知识。这种感觉就像领域知识在外面泄漏一样。此外,有界上下文之间的关系是隐藏的,你不会知道什么是上游,什么是下游。时间依赖性也会丢失:首先创建的是Person
还是User
?
如果您需要了解这一点,只需在您喜欢的搜索引擎上搜索"进行隐式显式软件开发"。如果您的结果不同,请阅读this。
P.S。为所有实体共享相同的值并不错。