Pep*_*dez 2 entity domain-driven-design value-objects
我一直在研究DDD的一个小项目.我到处都看到Value Objects是不可变的,因此,你无法修改它.只有实体.
我将使用每个人都使用的示例.地址.假设Address是 Customer实体的VO(也是根聚合).如果用户更新了他的地址,这在任何购物车场景中都有效,那么我该怎么做?我必须修改该VO地址,以便我将其保存到数据库中.意思是,这个VO必须以某种方式具有身份,以便我在数据库中识别它.除非NHibernate使用映射来处理它,对吧.你不是LinqToSql的情况.或者我想我必须创建一个新的聚合,其中地址是一个实体而不是?然后几乎有一个地址的副本我需要在我的聚合中的地址吗?
然而.我仍然无法包装整个Entity/VO概念.在我看来,就像在数据库中有表示的所有东西一样,即使你在模型中使用它作为VO,它也是某种实体,因为为了让你坚持它,你需要某种KEY来在数据库中识别它.
在一天结束时,所有Value Objects的数据都来自数据库(主要是).所以我仍然无法理解在数据更新的情况下如何使它们不可变.
经过两个月的激烈阅读,我发现整个DDD是一个巨大的矛盾问题.阅读所有这些博客,你会看到我在说什么.不幸的是,那里有ZERO演示应用程序,您可以将其用作角色模型或指导.它们都受到开发人员偏好的影响.然后他们最终攻击对方的博客.隔夜-DDD-Guru的博客真的有助于整个社区的混乱.
谢谢你的光临.期待进行建设性的讨论.
我相信你的困惑在于数据库行标识与DDD中与实体相关的身份概念之间的人为耦合.它们肯定是相关的,因为实体将在数据库中将相应的标识表示为标识列.但是,仅仅因为某些东西具有数据库行的标识,并不意味着该对象在DDD意义上具有标识.
在您的地址示例中,包含地址VO的值通常将存储在与客户实体相同的行中.这样,地址就是一个值对象,因为它没有存储在自己的行中而且没有标识.更新地址时,可以更改客户实体上的地址属性的值,而后者又反映在数据库行中.
在某些情况下,值对象将存储在自己的行中.例如,在定型销售订单模型中,订单是实体(聚合根),订单项是值对象.虽然行项目是VO,但在关系模型中,它们存储在自己的表中,并且很可能具有主键.但是,在域模型中,VO与订单实体绑定,并且在该实体之外没有标识.