2011-05-22 111 views
0

在域驱动设计(DDD)中,实体始终有其自己的唯一标识。如果实体成为聚合的根,聚合根是使用根实体的现有ID还是AR创建自己的ID?

在我阅读DDD时,我看到了一些陈述和例子,它们似乎混合了实体和聚合根之间的“独特身份”概念。根据示例,它们可能暗示:

  • 我只需要下面的一个接口。

  • 我两者都需要。

对于“Eric Evans type DDD”,我想知道哪种方法“正确”。

例如,假设您的实体实现此接口并返回一个GUID时,这种方法被称为:

public interface IEntity 
{ 
    object IdThatIsUniqueForThisEntityObject { get; } 
} 

你需要下面太与否的一个?

public interface IAggregateRoot 
{ 
    object IdThatIsUniqueForThisAggregateRootObject { get; } 
} 

是否聚合根需要实现像上面这样一个接口,所以它可以代表其自己唯一的ID(IdThatIsUniqueForThisAggregateRootObject)这是从它的根实体的ID(IdThatIsUniqueForThisEntityObject)单独和不同?

还是应该聚合根只使用根实体的(IdThatIsUniqueForThisEntityObject)来表示聚合根的唯一ID?

回答

2

您只需要EntityId。没有创建额外的聚合根身份。聚合根是一种聚合,用于控制访问并将对象组织为数据库工作的一个单元。聚合不会赋予对象任何种类的“新”或附加身份。

一个实体总是拥有唯一的实体标识并且应该足够。根据定义,检索作为聚合根的实体的操作也检索聚合。没有一个实体的概念,有时它只是独立的实体,而其他时候是聚合根。因此,根本不需要“根集合身份识别”的概念。

+0

谢谢。那么是否正确地说:“域上下文中的所有实体和值对象都必须包含在称为聚合的边界中,并且在域模型中访问任何实体或值对象的唯一方法是通过聚合根。一个实体和/或值对象不能(不应该)在集合边界之外访问。“? – Kerry 2011-05-22 23:20:36

+0

编号值对象(只要它们是不可变的)可以来自任何地方,并可以在任何地方使用。聚合规则不适用于值对象。除此之外,声明基本属实。独立对象实际上是一个集合。所以是的,所有实体对象都应该作为聚合根(可以将独立对象定义为聚合根)或通过实体所属的聚合根进行遍历。一个例外是在工厂。组装一个新的聚合需要什么。访问规则适用于最终的完整聚合。 – Sisyphus 2011-05-22 23:55:51