2009-04-27 108 views
0

在域驱动设计中,具有标识的对象是实体是众所周知的。例如,任何人都会有几种形式的身份(姓名等)。实体/值对象选择

但是值对象是没有身份的对象。一个共同的价值对象是地址,但是地址没有身份。但是在数据库层,我们可以有一个组合键。这个概念是否适用于DDD?通过道路名称,邮政编码和门号(省略城镇等信息)的组合可以识别地址。金钱会成为另一个价值对象。

的区别似乎是在没有单一的识别字段和值对象的对象往往不是实际属于实体。例如,“我”(用我的名字取代)可能穿鞋等,但“我”不是鞋子,衬衫等(http://www.lostechies.com/blogs/joe_ocampo/archive/2007/04/23/a-discussion-on-domain-driven-design-value-objects.aspx)。

这是要考虑的事情以正确的方式?另外,借助这种心态/方法,我可以将它应用于C#中的值/引用类型选择。尽管我可能会采用DDD方法吗?

感谢

回答

0

我认为你有实体和值类型正确区分的概念,因为它们都是领域驱动设计中理解(虽然我在这方面的专家很远 - 也许不如说你匹配我对这些概念的理解)。不过,我会建议不要在使用C#中的参考或值来选择是否将这些对象建模时,将其用作决定性指标。

的值和引用类型之间的主要区别是,当它们被传递给方法的值类型被复制。这意味着他们更有可能坐在堆栈上而不是堆上,并且可能更昂贵地通过;因此尺寸成为考虑因素。建议一个结构应该低于16个字节的大小(在here备注底部)和一个全面的地址结构(房屋号码,房屋名称,街道地区,城市,国家等)很容易破坏这一点。

尽管如此,实体:value :: class:struct的语义非常相似,我可以看到从这种方式建模数据有很多好处(住在同一地址的两个人不要分享这个地址,因为改变一个人的地址不应该改变另一个人的地址,所以把地址作为一个结构体来强制这种分离,而应用程序中一个人的所有实例都应该指向同一个人)。但是有性能和内存方面的考虑。也许不可变的类会适合这些值类型?

综上所述:在DDD实体和价值之间的区别是根据各地的对象是什么。在代码中应该基于你打算如何处理它。

+0

实体/值对象的区别可以用C#类和结构之间的选择有所帮助。我确信有可能导致异常的考虑因素(在其他情况下选择相反的类型,关于对象的所有其他事实使其适用于一种类型)。但是,可以修改地址(建筑物)。这不应该是可变的吗?一个引擎可能是一个结构体和一个较小物体的组合,但它也可以被修改。 – dotnetdev 2009-04-27 21:59:31