咨询一下关于值对象集合的管理.

有这么一种情况,不知道大家是否遇到,当一个Entity A中包含了一种Value Object A,而且,使一对多的关系,就是说一个Entity A包含多个Value Object A,我想问问如何维护,比如,我想删除其中一个Value Object A从这个Entity A中,或者我想保证Value Object A的内容不重复。

具体例子是,如果一个账户(entity)拥有多个地址,比如Amazon这类的网站都可以设立多个地址,有的是付款地址,有的是有机地址,有的还可以使多个认证后的有机地址(朋友家的,或者送礼的),当这些地址出现后,你在删除其中一个的时候,势必需要去具体操作一个Value Object,这种情况下如何做!?


谢谢各位先,

按照聚集的整体思路,我觉得多个地址是都是值对象,需要的时候即时生成,如果缓存里有就直接去取!

如果多个账户有相同的地址,那就直接引用这个地址值对象就可以了。节省内存 提高性能~~~ 我自己的体会还请高手发言~

我说的是一个账户有多个地址,不是多个账户应用一个地址!

我希望各位在回答问题之前,先看清楚我的问题,谢谢。

值对象是不关心它是哪一个,不用去分辨,你又想删除其中一个Value Object A,就是想分辨,所以,这里地址就不是值对象,而是实体

banq已经给出了正确的答案:-)

banq你好,那我请问一下,在这个帖子里面,很明显,在一个人引用照片的时候,这个照片的引用还是需要维护的,比如删除这个引用的,那为什么你有建议她是用值对象呢?


谢谢
[该贴被lonelybug于2009-12-03 13:19修改过]

呵呵,照片这个帖子我是从它想共享角度考虑,只要是对象,都要被父对象引用,关键在于对引用维护的解释。

引用维护可以将引用彻底全部删除,或全部重新建立,这是符合值对象引用,如果你想对引用集合中个别引用进行维护,有针对性的维护,那就不是值对象了。

我有一个想法,

是不是值对象很少出现一对多的现象,大部分都是一对一的,就是一个Entity拥有一个Value Object来描述一个类型的属性。

却很少出现一个Entity包含一组Value Object来描述一个类型的属性,就如同所举的例子。

因为按照需要指导那个是那个的原理的话,很难维护多个Value Object,除非是那些Value Object一旦生成了,在这个Entity的生命周期内不需要被维护的,比如,做删除操作,更新才作,而只是可以不断的添加和提取。

也就是说,如果单一的Value Object我们可以通过一个Set方法来进行替换已有的,但是,如果出现一组Value Object,我们除非替换整组的Value Object,否则的话,只能做添加操作。

有点罗嗦,不知道各位可以看懂么!


谢谢热心人跟贴。

2009年12月03日 13:44 "lonelybug"的内容
我有一个想法,
如果单一的Value Object我们可以通过一个Set方法来进行替换已有的,但是,如果出现一组Value Object,我们除非替换整组的Value Object,否则的话,只能做添加操作。

很好地想法,我们通过做成一对一关联,强调值对象集合是一个整体。这属于值对象的最佳实践吧。

其实我觉得还是应该从值对象的本质去理解。
值对象:没有标示,不用持久。

简单的例子:
查询订单并显示到前台。

这里查询到的订单其实就是值对象,虽然我们可能用某个实体类去映射了查询结果,
但它仍然是值对象。

但是如果你要修改其中的查询结果,那就是实体了(现实是我们会构造一个实体去保存,或者根据实体的标示去保存)。

我想问问yananay兄,你说不用持久这个观点是从哪里来的!?

Value Object一样需要最终被存储的,我不知道你学习DDD的时候看书不看书呢?

Value Object和Entity都是需要最后被存储的,而且,你举的例子实在是太不准确和不恰当。

"Value Object一样需要最终被存储的,我不知道你学习DDD的时候看书不看书呢?"

我还能说什么呢?有的时候觉得在这里讨论这样的话题真的很累,很无聊。