这个问题在这里有一点背景。。。。
具有DB-id和实体的值对象的DDD类设计困境
由于没有人对我的问题给出令人信服的答案,我将重新表述我的问题,并让回答问题的人从中受益。也许我的问题提得不对。
在这一点上,我假设你已经阅读了我最初的问题。
因此,ContactInfo不需要有域标识,因为它属于User。没有用户,它"不可能存在"。它只不过是一个类(nhibernate组件),它包装了其他类和集合(来自数据库),因此,如果我想用一个新实例替换它,那么让它不可变将是一场噩梦。我需要创建一个包含n个参数的完整构造函数,并重新创建整个对象图,因为我想更新地址集合中的一条街道。在我看来,笨蛋。
那么ContactInfo到底是什么?可变ValueObject?我敢肯定,DDD大师Evan在谷歌上有一个关于"可变valueobject"的提醒,每次出现这两个术语时,都会有一个驱魔师在手边发送。
我对此感到很困惑。因为我不想成为一个"f…it"类型的程序员,只想让ContactInfo变得可变(但在这一点上我别无选择)。因此,在我对DDD的概念有自己的解释(和实现)之前,我想有一些意见。
附言:我知道这可能会让人觉得很粗鲁,但请不要再复制粘贴埃文书中的答案。既不是抽象概念。我们都知道Order和Orderline,我们都知道struct和reference类型,Blog,Post和Comments。这是一个特定的场景,包含了您需要了解的有关此问题的所有信息。。。所以我真的很感激能对这种情况给出一个具体的答案。
谢谢:)
-
"没有就不能存在"规则主要适用于根的子实体,而不一定适用于值对象。如果看到
ContactInfo
实体中有不可变的值对象,我不会感到震惊,只要它不是聚合根。 -
现在,如果你真的希望
ContactInfo
从头到脚都是一个不可变的值对象,并且不想重新实例化一个95%相似的对象,你可以创建一个Builder变体,以一种简短而优雅的方式生成一个与现有实例略有不同的实例。类似ContactInfo.BuildFrom(oldContactInfo).WithPrimaryAddress(newPrimaryAddress)
的东西。
无论如何,我的建议是选择一种解决方案,不要陷入分析瘫痪。如果我错了,请纠正我,但我怀疑这些类是否是系统的关键部分,所以您可以在以后以最小的影响重构它们。