gpt4 book ai didi

domain-driven-design - DDD 实体、值对象和数据库映射和更新。不变的矛盾?

转载 作者:行者123 更新时间:2023-12-04 21:09:29 26 4
gpt4 key购买 nike

我一直在用 DDD 做一个小项目。我到处都看到值对象是不可变的,因此,您不能修改它。只有实体。

我将使用每个人都使用的示例。地址。假设 Address 是 Customer 实体(也是根聚合)的 VO。如果用户更新他的地址,这在任何购物车场景中都是有效的,那么我该怎么办?我必须修改那个 VO 地址,以便将它保存到数据库中。意思是,这个 VO 必须以某种方式具有身份,以便我在数据库中识别它。除非 NHibernate 使用映射来处理它,对吧。 LinqToSql 不是这种情况。或者我想我必须创建一个新的聚合,其中 Address 是一个实体?然后几乎在所有需要地址的地方都有地址的副本?

但是。我仍然无法概括整个 Entity/VO 概念。在我看来,所有在数据库上都有表示的东西,即使你在你的模型中将它用作 VO,它在某种程度上也是一个实体,因为为了让你坚持下去,你需要某种 KEY 来在数据库中识别它.

归根结底,所有值对象的数据(大部分)都来自数据库。所以我仍然不明白在数据更新的情况下你必须如何使它们不可变。

经过两个月的精读,我发现整个 DDD 是一个巨大的矛盾问题。阅读所有这些博客,您就会明白我在说什么。不幸的是,那里有零个演示应用程序,您可以将其用作榜样或指南。它们都非常受开发人员偏好的影响。然后他们最终攻击对方的博客。 Overnight-DDD-Guru 的博客确实有助于解决整个社区的困惑。

感谢您的光临。期待进行建设性的讨论。

最佳答案

我相信您的困惑在于数据库行标识与 DDD 中与实体关联的标识概念之间的人为耦合。它们肯定是相关的,因为一个实体将有一个相应的标识在数据库中表示为标识列。但是,仅仅因为某物具有作为数据库行的标识,并不意味着该对象具有 DDD 意义上的标识。

在您的地址示例中,包含地址 VO 的值通常存储在与客户实体相同的行中。通过这种方式,地址是一个值对象,因为它没有存储在自己的一行中并且没有标识。更新地址时,您更改了客户实体的地址属性值,这又反射(reflect)在数据库行中。

在某些情况下,值对象会存储在它自己的行中。例如,在典型的销售订单模型中,订单是实体(聚合根),订单项是值对象。虽然订单项是 VO,但在关系模型中,它们存储在自己的表中,并且很可能具有主键。然而,在域模型中,VO 与订单实体相关联并且在该实体之外没有身份。

关于domain-driven-design - DDD 实体、值对象和数据库映射和更新。不变的矛盾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13424728/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com