2011-02-15 50 views
6

有几个关于这方面的问题,阅读它们并没有帮助我。在Eric Evans DDD中,他在某些情况下使用地址作为值类型的示例。对于邮购公司来说,地址是一种价值类型,因为地址是共享的,谁住在地址上并不重要,只要包裹到达地址即可。DDD:帮助我进一步了解价值对象和实体

这对我来说很有意义,直到我开始思考如何做到这一点的设计。考虑到图99页上,他这样说:

+------------+ 
|Customer | 
+------------+ 
|customerId | 
|name  | 
|street  | 
|city  | 
|state  | 
+------------+ 

这变为:

+------------+ 
|Customer | (entity) 
+------------+ 
|customerId | 
|name  | 
|address  | 
+------------+ 

+------------+ 
|Address  | (value object) 
+------------+ 
|street  | 
|city  | 
|state  | 
+------------+ 

如果这些表格,地址将有其自己的ID,才能有与的关系客户,把它变成一个实体。

在关系数据库中,它们会留在同一个表中(例如在第一个示例中),并且您会使用ORM的功能将地址抽象为值对象(如nHibernate的组件功能)?

我意识到几页后,他谈到了非规范化,我只是想确保我正确理解概念。

回答

2

的理念是在关系数据库 这些会留在同一个 表,如在第一个例子, 和你使用ORM 的功能,以抽象的地址作为值对象 (如nHibernate的组件 功能)?

是,一般,就是这个想法。或者(如果你的ORM不直接支持Value Objects),你可以让VO表有一个ID,但隐藏在你的域模型中。

1

我个人不给该死,只要他们正常重写等式比较具有价值的对象ID(原因值对象不同在于它们的价值不认同)。

映射值对象数据库技术的关注,有时(例如标记道具虚拟的,这样可以ORM底下爬)你只需要牺牲域模型的纯度位。或者让你的基础设施更加智能 - 使用nhib组件或其他东西。

7

当埃里克埃文斯谈到“实体具有身份,价值对象不会”时,他并不是在谈论数据库中的ID列 - 他在谈论身份是一个概念。

虚拟组织有没有概念上的身份。这并不意味着他们不应该有持久的身份。不要让持久性实现影响您对实体vs VOs的理解。

可以在客户

+0

感谢您的解释,这有助于我对这种情况下使用DDD感到更加自信。 – jpierson 2011-03-10 17:19:57

1

是的,一般地址会留在同一个表中创建单独的表的地址或在同一个表。地址映射如下:

+-----------------+ 
|Customer   | 
+-----------------+ 
|customerId  | 
|name    | 
|address_street | 
|address_city  | 
|address_state | 
+-----------------+ 

如果Address是一个实体,那么它将在一个单独的表中,正如您所说的那样。如果两个相同的客户链接到相同的地址实体,则更改该地址的属性将影响两个客户。然而,VO实现只会影响其中一个。