DDD类没有标识但不能是ValueObject因为需要变异(更改)

时间:2012-12-12 03:57:43

标签: domain-driven-design immutability value-objects

这个问题在这里有一点背景......

DDD class design dilemma with Value Objects with DB id and Entities

由于没有人给我一个令人信服的答案,我将重新解释我的问题并给予那些回答怀疑的人。也许我没有提出我的问题。

我现在假设您已经阅读了我的初步问题。

因此,ContactInfo不需要具有域标识,因为属于User。没有用户,它“不能存在”。它只是一个包含其他类和集合(来自数据库)的类(nhibernate组件),因此,如果我想将它替换为新实例,那么使它成为不可变只会是一场噩梦。我需要创建一个包含n个参数的完整构造函数,并重新创建整个对象图,因为我想更新地址集合中的一条街道。对我来说,愚蠢。

接下来是ContactInfo的世界?一个可变的ValueObject?我很确定DDD大师Evan对“可变价值对象”有一个谷歌警报,并且每当这两个术语出现时,就会派出一名驱魔人员。

我对此非常困惑。几乎卡住了,因为我不想成为“f ...它”有点像程序员而只是因为(但此时我别无选择)使ContactInfo变得可变。所以,在我最终拥有自己对DDD概念的解释(和实现)之前,我想提出一些意见。

PS:我知道这可能会很粗鲁,但请不要复制并粘贴Evan的书中的答案。既不抽象的概念。我们都知道订单和订单行,我们都知道结构和引用类型,博客,帖子和评论。这是一个特定的场景,包含您需要了解的有关此问题的所有信息...所以我非常感谢这个场景的具体答案。

谢谢:)

1 个答案:

答案 0 :(得分:1)

  1. “不能没有”规则主要适用于Root的子实体,不一定是Value Objects。如果ContactInfo实体中包含不可变值对象,只要它不是聚合根,我就不会感到震惊。

  2. 现在,如果您真的希望ContactInfo从头到脚成为不可变的值对象,并且不希望重新实例化95%相似对象的痛苦,那么您可以创建一个{{ 3}} variant以简短,优雅的方式生成与现有实例略有不同的实例。像ContactInfo.BuildFrom(oldContactInfo).WithPrimaryAddress(newPrimaryAddress)

  3. 之类的东西

    无论如何,我的建议是寻求一个解决方案而不是陷入分析瘫痪。如果我错了,请纠正我,但我怀疑这些类是你系统的关键部分,因此你可以随后以最小的影响重构它们。