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

时间:2018-01-06 22:44:30

标签: domain-driven-design aggregateroot aggregates

将共享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)

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

1 个答案:

答案 0 :(得分:0)

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

如果您需要了解这一点,只需在您喜欢的搜索引擎上搜索"进行隐式显式软件开发"。如果您的结果不同,请阅读this

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