我一直在做 DDD 的一个小项目。我到处都看到值对象是不可变的,因此,你不能修改它。只有实体。
我将使用每个人都使用的示例。地址。假设Address 是Customer 实体的 VO(也是根聚合)。如果用户更新他的 Address,这在任何购物车场景中都有效,那么我应该怎么做?我必须修改那个 VO 地址才能将其保存到数据库中。意思是,这个 VO 必须以某种方式具有身份,以便我在数据库中识别它。除非 NHibernate 使用映射来处理它,对。LinqToSql 你不是这种情况。或者我想我必须创建一个新的聚合,其中地址是一个实体?然后几乎在我的聚合中需要地址的任何地方都有一个地址副本?
然而。我仍然无法包装整个 Entity/VO 概念。在我看来,就像在数据库中有表示的所有内容一样,即使您将其用作模型中的 VO,它在某种程度上也是一个实体,因为为了让您持久保存它,您需要某种 KEY 来在数据库中识别它.
归根结底,所有值对象的数据(大部分)都来自数据库。所以我仍然不明白在数据更新的情况下如何使它们不可变。
经过两个月的紧张阅读,我发现整个 DDD 是一个巨大的矛盾问题。阅读所有这些博客,你会明白我在说什么。不幸的是,那里有零演示应用程序,您可以将其用作榜样或指导。它们都受到开发者偏好的影响。然后他们最终攻击了对方的博客。一夜之间-DDD-Guru 的博客确实有助于解决整个社区的困惑。
感谢您的光临。期待建设性的讨论。