领域驱动设计 - 价值对象或实体

时间:2013-11-22 12:22:52

标签: entity domain-driven-design value-objects domain-object

我在下面的案例中有一个关于识别值对象的问题,以及我必须如何实现它。

案例:

在在线社区中,用户可以创建自己的私人/公共页面(例如Facebook)。在这个页面中,他们可以发帖等。这些帖子可以由其他用户评分。不仅可以对帖子进行评级,而且其他用户也可以对整个页面进行评级。

因此,如果我尝试对此进行建模,我最终会得到3个实体(页面,用户,帖子),这些实体在此内容中都具有唯一标识。 但收视率怎么样?我倾向于一个价值对象,因为评级在这个内容中没有足够的身份(没有它的帖子或页面可能存在),没有用户就不能存在。

问题:它是值对象还是实体:)

谢谢!

3 个答案:

答案 0 :(得分:2)

在我看来,您的评级系统是高度并发的,因为您期望来自许多并发用户的单个AR的评级。如果两个并发评级进入,这肯定会导致过时AR的大问题。你更好地使你的评级成为他们自己的AR,以允许同时创建单个帖子/页面的评级,例如,参见Vaughn Vernon的IDDD书籍谈论并发用户。

答案 1 :(得分:0)

鉴于您对问题的描述,Rating是一个值对象。

值对象确实是领域专家和用户可以用来描述实体质量但未被识别的东西。

Rating类可以通过shared identifiers保存对用户实体的引用,Post类可以有void Register(Rating rating)之类的命令。

答案 2 :(得分:0)

当您尝试将对象设为值对象时,请不要仅考虑其身份。值对象在应用程序中应该是不可变的而不是太多,例如品牌。世界上所有品牌都不超过系统的用户或页面。或某些情况下的金钱和地址 因为并非每个对象都具有同一性,所以值对象是通过以两种方式选择一个对象作为实体或值对象来降低复杂性而不使现有问题更复杂! 在您的情况下:页面,用户和帖子可以是聚合的实体或可能是聚合根(基于您的应用程序),但系统的速率可以是实体或值对象。如果它没有通过聚合根检索它的标识,则将其指定为值对象,但在其他情况下,它可以是聚合的实体。 看看这篇关于DDD的短篇博文: http://www.ehsanghanbari.com/Post/15/domain-driven-design-alphabet