DDD:在聚合根中建模本地身份

时间:2011-09-26 18:34:43

标签: domain-driven-design entity local identity

阅读蓝皮书(Eric Evan的领域驱动设计)并开始在类似应用程序的简单博客中应用DDD概念后,我有以下问题,如何在聚合根目录中建模实体的本地身份? / p>

让我们说为了简单起见,我有一个简单的博客模型,其中包含以下实体和方案: 注册用户可以发布帖子,帖子可以关联一个或多个标签,注册或未注册的用户可以在帖子上发布评论。

在这种情况下,实体是User,Post和Comment,聚合根是User nat Post在Post聚合根内注释聚合。

因为评论实体在Post内部有一个本地标识,我该如何建模其本地标识? I.E.我不能仅仅通过它的属性来区分评论,因为我可以对同一用户发布的具有相同内容的同一帖子有不同的评论...

我首先想到帖子评论列表中评论的顺序,以识别帖子中的评论,但这在并发环境中变得非常复杂,比如两个客户可以在博客上发表评论的Web应用程序,我会有碰撞直到我将它们存储在数据库中。除此之外,我需要保留从存储库恢复注释列表的逻辑,其顺序是将帖子保存到存储库...

然后在Post中有一个唯一的标识符计数器,并在发布的每个注释中自动增加它,但在并发环境中变得复杂,那么如何在聚合根中建模本地标识?

由于 巴勃罗

2 个答案:

答案 0 :(得分:3)

好问题。来自Eric Evan's书:

  

边界内的ENTITIES具有本地身份,仅在其中具有唯一性   AGGREGATE。

     

...只有AGGREGATE根可以直接使用数据库查询获得。必须通过遍历关联找到所有其他对象。

我认为第二部分是重要的。您应该评论ID视为本地身份。换句话说,你不应该绕过它的聚合根(Post)来检索注释,引用来自外部的注释等。从技术上讲,Commend Id可以是由数据库生成的相同AUTOINCREMENT字段,就像你对User和Post(或任何其他id)一样来自hibernate的生成器)。但概念上评论将具有本地身份。这是Aggregate Root的工作来解决它。

答案 1 :(得分:2)

我不是DDD专家,但我认为也许Comment应该是一个价值对象。值对象没有“概念身份”,但它肯定具有持久性标识。通常,您应该更喜欢使用值对象而不是实体,因为后者通常会有更多的开销。

不要将持久性身份与概念身份混为一谈。我在开始时很难理解。