DDD:连接对象是实体对象还是值对象?

时间:2012-04-26 12:59:38

标签: domain-driven-design

我正在开发一个应用程序,用户可以以类似于Twitter的方式互相关注。

在阅读DDD之后,我了解我的用户是实体对象 - 我使用他们的唯一ID来引用它们。

当一个用户“跟随”另一个用户(即形成一个连接)时,该关系存储在多对多表中。其字段包括FollowerIDTargetIDStatus。每个Follower / Target组合只能有两个记录(一个是Active,另一个是Inactive),所以我可以根据属性安全地识别对象。

所以,我认为我的Connection对象是Value Objects,而不是Entity Objects,但我不确定。你能帮我做出这个决定吗?

2 个答案:

答案 0 :(得分:5)

您是正确的,实体是唯一的并且带有具有身份的概念(即,只能存在一个唯一用户)。 Connection依赖于其他User实体。它代表了两个用户之间的某些方面。这方面是指是否存在活动或非活动连接。如果不包含用户连接的数据,则连接没有标识。它甚至可能在数据库中拥有它自己的主键,但从域的角度来看,它没有自己的身份。

因此,我会说Connection是一个对象。


为了支持我的结论, Microsoft.Net Architecting Applications for the Enterprise ,第187页说:

  

值对象类主要表示域中的实体   包含其包含的数据的数据和生命。值对象是   完全由它包含的值组合标识。一个实体   另一方面,物体有自己的生命和丰富的行为   不管它包含哪些数据。实体对象通常是对象   寿命更长。值对象表示一个方面   实体,只能与实体相关。

还有第189页:

  

需要进一步评论来解释它们之间的区别   实体和价值对象。您不需要存储库或数据   值对象的映射器。您只需要一个实体的存储库。   给定实体的存储库(或映射器)肯定会采用   照顾依赖于给定实体的所有价值对象。

答案 1 :(得分:3)

前一段时间,我看到一部关于发明克隆的科学家的漫画。每当他克隆自己,他就摧毁了以前的版本。然后正在观看示威的人决定打断并破坏破坏部分,因此有两位科学家。卡通以一些有趣的存在主义问题结束了。

值与实体不是关于是否具有一种或另一种形式的id字段。重点是 - 我们如何通过域视角查看这些对象。如果它们是价值对象,那么只有它们的价值才重要 - 第1,第3和第53位科学家是相同的。如果我们关心身份,如果我们认为克隆第三位科学家永远不会像第一位,那么我们的对象就是一个实体。