6

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

在阅读了 DDD 之后,我了解到我的用户是实体对象——我使用他们的唯一 ID 来指代他们。

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

所以,我认为我的 Connection 对象是值对象,而不是实体对象,但我不确定。你能帮我做这个决定吗?

4

2 回答 2

5

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

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


为了支持我的结论,Microsoft.Net 为企业构建应用程序,第 187 页说:

值对象类表示域中的一个实体,该实体主要包含数据并为它所包含的数据而存在。值对象由其包含的值的组合完全标识。另一方面,实体对象有自己的生命和丰富的行为,无论它包含什么数据。实体对象通常是具有较长生命周期的对象。值对象代表实体的一个方面,并且只能与实体相关。

同样在第 189 页:

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

于 2012-04-26T14:54:22.253 回答
4

前段时间,我看了一部关于发明克隆的科学家的漫画。每次克隆自己,他都会破坏之前的版本。然后正在观看演示的人决定打断并破坏破坏部分,所以有两个科学家。卡通以一些有趣的存在主义问题结束。

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

于 2012-05-02T09:17:24.950 回答