我目前正在使用DDD方法设计Web应用程序。在区分实体和值对象时,我遇到了一个这样的模型元素,我无法决定将其放在Entity / VO类别下。
每个订单将与1个且仅与1个评论历史记录对象相关联,该对象管理评论列表。现在,当编辑订单时,用户可以添加评论。这会附加到评论历史记录中。
注释历史对象本身并不代表持久性。我打算使用nHibernate“组件”,所以只有注释列表才能写入ORDER_COMMENTS表。
订单是实体。
评论历史(各种用户的评论是否附加在订单中)应该是实体还是VO?
答案 0 :(得分:5)
CommentHistory是一个实体 因为您向它添加注释,而不是每次更改时都替换整个历史记录。
这意味着 - 它可以修改
如果它是可修改的,它必须有一个标识,一个已知的“挂钩”,你可以“悬挂”状态变化。
如果它具有独立于州的身份,it's an entity:
实体:
一个不是由其属性定义的对象,而是一个连续性线程及其标识。
相反 - 值对象由其状态标识。如果它们由状态标识,那么,如果状态发生变化,则它已经是另一个对象。对象改变自己身份的能力将是太多的自由,最终会导致混乱。这导致了价值对象应该是不可变的结论(它们的状态每个结构只定义一次)。
这是另一个例子:
假设Citizen
就像评论一样。公民被“追加”到Country
。如果国家是一个价值对象,每当新公民出生时,整个国家都需要重建。
答案 1 :(得分:1)
从我的观点来看,我将评论历史视为价值对象,我的意思是,评论历史只是给定时间的评论集合。尽管每次添加评论时都可以重建或不重建评论历史记录,但它没有自己的标识和生命周期。
我的意思是,如果您必须使用相同的评论评论历史记录,我们是否有两个不同的评论历史记录?我不这么认为,我们有相同的评论历史,我们不关心我们关心属性的身份,即评论历史中的评论是相同的。
所以对我来说,评论历史是V.O。
由于 巴勃罗
答案 2 :(得分:0)
注释是上述所有原因的值类型。
CommentHistory是Order的属性,不需要单独的对象。它只是Comment值的集合。 Order在内部维护集合,并通过AddComment方法控制访问。