2012-04-26 134 views
5

我正在开发一个应用程序,用户可以按照与Twitter类似的方式跟随对方。DDD:连接对象是实体对象还是值对象?

读完DDD后,我明白我的用户是实体对象 - 我使用他们的唯一ID来引用它们。

当一个用户'追随'另一个(即形成连接)时,该关系被存储在多对多表中。其字段包括FollowerID,TargetIDStatus。每个追随者/目标组合只能有两条记录(一个是活动的,另一个是非活动的),所以我可以根据它们的属性安全地识别对象。

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

回答

4

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

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


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

值对象类表示在大多 包含数据和生命为它包含的数据域的实体。值对象是 ,它由包含的值的组合完全标识。另一方面,实体 对象具有自己的生活和丰富的行为 ,无论其包含的数据如何。实体对象通常是具有较长使用期限的对象 。值对象表示实体的一个方面,只能与实体相关。

而且还189页上:需要

一个进一步的评论,说明 实体和值对象之间的差异。您不需要存储库或数据对象的数据 。您只需要一个实体的存储库。 给定实体的存储库(或映射程序)肯定会取决于给定实体的所有值对象。

+0

“不包含用户连接的数据,连接没有标识” - 该连接对于FollowerID和TargetID的组合是唯一的。所以如果我们有一个TaregtID和FollowerID,我认为它是userids,我们可以识别一个连接。那么它怎么不是一个实体对象呢? – 2012-04-27 00:43:56

+0

@HariSubramaniam,另一种说法是[本网站](http://lostechies.com/joeocampo/2007/04/23/a-discussion-on-domain-driven-design-value-objects/)说,“没有一个实体,价值对象就不能独立生存”。确定哪个是哪一个并不总是容易的,但是在思考并研究之后,我倾向于将其视为一个价值对象。 – Matt 2012-04-27 14:19:35

2

前一段时间,我看到一个关于发明了克隆技术的科学家的漫画。每次他克隆自己时,他都销毁了以前的版本。然后,观看示威的人决定中断和破坏破坏部分,因此有两名科学家。卡通以一些有趣的存在主义质疑结束。

值vs实体不是关于是否拥有一个或另一个表单中的id字段。要点是 - 我们如何通过我们的域视角来看待这些对象。如果他们是价值对象,那么只有他们的价值重要 - 第一,第三和第53科学家是一样的。如果我们关心身份,如果我们认为克隆第三位科学家永远不会像第一位科学家那样,那么我们的对象就是一个实体。

相关问题