我正在开发一个应用程序,用户可以以类似于Twitter的方式互相关注。
在阅读DDD之后,我了解我的用户是实体对象 - 我使用他们的唯一ID来引用它们。
当一个用户“跟随”另一个用户(即形成一个连接)时,该关系存储在多对多表中。其字段包括FollowerID
,TargetID
和Status
。每个Follower / Target组合只能有两个记录(一个是Active,另一个是Inactive),所以我可以根据属性安全地识别对象。
所以,我认为我的Connection对象是Value Objects,而不是Entity Objects,但我不确定。你能帮我做出这个决定吗?
答案 0 :(得分:5)
您是正确的,实体是唯一的并且带有具有身份的概念(即,只能存在一个唯一用户)。 Connection
依赖于其他User
实体。它代表了两个用户之间的某些方面。这方面是指是否存在活动或非活动连接。如果不包含用户连接的数据,则连接没有标识。它甚至可能在数据库中拥有它自己的主键,但从域的角度来看,它没有自己的身份。
因此,我会说Connection
是一个值对象。
为了支持我的结论, Microsoft.Net Architecting Applications for the Enterprise ,第187页说:
值对象类主要表示域中的实体 包含其包含的数据的数据和生命。值对象是 完全由它包含的值组合标识。一个实体 另一方面,物体有自己的生命和丰富的行为 不管它包含哪些数据。实体对象通常是对象 寿命更长。值对象表示一个方面 实体,只能与实体相关。
还有第189页:
需要进一步评论来解释它们之间的区别 实体和价值对象。您不需要存储库或数据 值对象的映射器。您只需要一个实体的存储库。 给定实体的存储库(或映射器)肯定会采用 照顾依赖于给定实体的所有价值对象。
答案 1 :(得分:3)
前一段时间,我看到一部关于发明克隆的科学家的漫画。每当他克隆自己,他就摧毁了以前的版本。然后正在观看示威的人决定打断并破坏破坏部分,因此有两位科学家。卡通以一些有趣的存在主义问题结束了。
值与实体不是关于是否具有一种或另一种形式的id字段。重点是 - 我们如何通过域视角查看这些对象。如果它们是价值对象,那么只有它们的价值才重要 - 第1,第3和第53位科学家是相同的。如果我们关心身份,如果我们认为克隆第三位科学家永远不会像第一位,那么我们的对象就是一个实体。