在域驱动设计中,众所周知,具有身份的对象是实体。例如,任何人都会有几种形式的身份(姓名等)。
但是值对象是那些没有身份的对象。一个常见的值对象是地址,但地址没有标识。但是在数据库层,我们可以有一个复合键。这个概念在DDD中有用吗?通过路名,邮政编码和门号的组合(省略城镇等信息),可以识别地址。金钱将是另一个价值对象。
区别似乎是没有单个可识别字段的对象,而值对象往往不属于实体。例如,“我”(替换为我的名字)可能会穿鞋等,但“我”不是鞋子,衬衫等(http://www.lostechies.com/blogs/joe_ocampo/archive/2007/04/23/a-discussion-on-domain-driven-design-value-objects.aspx)。
这是思考问题的正确方法吗?此外,通过这种心态/方法,我可以将其应用于C#中的值/引用类型选择。我可以选择DDD方法吗?
由于
答案 0 :(得分:0)
我认为实体和价值类型之间的区别是正确的,因为它们在域驱动设计中被理解(尽管我在这个问题上远非专家 - 或许更好地说你符合我对这些概念的理解) 。但是,在选择是否将这些对象建模为C#中的引用或值时,我建议不要将此作为决定性指标。
值和引用类型之间的主要区别在于,值类型在传递给方法时会被复制。这意味着他们更有可能坐在堆栈而不是堆上,并且传递成本更高;因此,尺寸成为考虑因素。建议结构应该小于16个字节(在备注here的底部)和一个综合的地址结构(门牌号,房屋名称,街道区域,城市,国家等...)将很容易打破这个。
尽管如此,实体:value :: class:struct的语义非常相似,我可以看到通过这种方式建模数据的很多好处(两个住在同一地址的人不会分享该地址,因为更改一个人的地址不应该改变另一个人的地址。所以将地址作为结构将强制执行这种分离。而应用程序中某个人的所有实例应该指向同一个人) 。但是有性能和内存考虑因素。也许不可变类很适合这些值类型?
总结:DDD中实体和值之间的区别是基于对象的内容。在代码中应该基于你打算用它做什么。