域驱动设计和聚合中的本地身份

时间:2013-03-05 22:46:34

标签: domain-driven-design aggregate identity

在域驱动设计中,有一个聚合根,它引用了内部实体。

Aggregate Root是一个具有全局标识的实体(每个人都可以使用其id)。聚合根具有指向本地对象(实体)的链接。

假设实体是Hibernate @Entities(比如说)

假设我们有聚合根“用户”,其中包含“地址”实体作为对象(实际上也是一个实体)

问题是: 如何使本地实体仅具有本地身份。我的意思是,没有任何障碍可以阻止任何人通过其ID使用本地实体(如地址)。 (那么这个身份根本不是本地的,而是全球的)。然后,让它成为本地的方法是什么?

3 个答案:

答案 0 :(得分:3)

所有实体(包括root)都具有标识。只有聚合根的标识应该“全局”使用的事实是代码本身无法轻易实现的。特别是在关系数据库中,每个表记录都有一些键,无论该记录是存储聚合根,还是实体或值对象。因此,开发人员可以识别哪些数据库标识是域的一部分,哪些不是。

答案 1 :(得分:3)

我认为这不是公共领域或财产或某些访问限制机制的问题,我认为它的方式“本地身份”意味着聚合边界之外的对象不能使用该本地身份一种有意义或有用的方式(例如,他们不能使用该标识来检索该对象或将其持久保存到数据库或任何其他操作)。这种身份对外部世界没有任何意义,只有在这种集合中才是唯一的。另一个例子是,什么保证聚合边界之外的对象不会保持对其中对象的引用(这违反了聚合的原则之一),除非这些对象是VALUE OBJECTS,每次都不是这种情况。如果我想用几句话说:不要创建任何使用聚合中对象标识的公共API,这样你就可以让开发人员明白不要使用这些ID。

答案 2 :(得分:2)

聚合根中的实体应该只具有本地标识。对于所有意图和目的,数据库表不需要具有主键。当聚合物被水合时,应该基于它们与AR的链接来获取AR内的实体。但即使 FK也不需要在本地实体中表示,因为基于对AR的本地实体的包含,连接是显而易见的。

由于大多数数据库系统都会在桌面上没有PK时呻吟,所以你可以添加一个,但你可以在实体设计中忽略它。因此实体中没有PK的属性。有人可以通过DB访问该实体的唯一方法是,因为代码中没有办法这样做。