在一对一相关域聚合之间使用共享 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 的事实将被隐藏,只有在应用程序服务中才能找到此知识。这有点像领域知识泄露到外面。另外,限界上下文之间的关系是隐藏的,你不会知道什么是上游什么是下游。时间依赖性也丢失了:首先创建什么,Person
或 User
?
如果您需要了解此内容,只需在您首选的搜索引擎上搜索 "make the implicit explicit software development"。以防万一您的结果不同,您应该阅读 this.
P.S。为所有实体共享相同的 value 也不错。
将共享 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 的事实将被隐藏,只有在应用程序服务中才能找到此知识。这有点像领域知识泄露到外面。另外,限界上下文之间的关系是隐藏的,你不会知道什么是上游什么是下游。时间依赖性也丢失了:首先创建什么,Person
或 User
?
如果您需要了解此内容,只需在您首选的搜索引擎上搜索 "make the implicit explicit software development"。以防万一您的结果不同,您应该阅读 this.
P.S。为所有实体共享相同的 value 也不错。