0

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

带有 DB id 和实体的值对象的 DDD 类设计困境

由于没有人对我的问题给出令人信服的答案,我将重新表述我的问题,并让回答问题的人受益。也许我没有正确提出我的问题。

我假设此时您阅读了我最初的问题。

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

那么,ContactInfo 到底是什么?一个可变的值对象?我很确定 DDD 大师 Evan 有一个关于“可变值对象”的谷歌警报,并且每次出现这两个术语时都会有一个驱魔人发送。

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

PS:我知道这可能会显得粗鲁,但请不要再复制和粘贴 Evan 书中的答案。既不是抽象的概念。我们都知道 Order 和 Orderline,我们都知道结构和引用类型、Blog、Post 和 Comments。这是一个特定场景,您需要了解有关此问题的所有信息......所以我真的很感激这个场景的具体答案。

谢谢 :)

4

1 回答 1

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

  2. 现在,如果您真的想ContactInfo成为一个从头到脚不可变的值对象并且不想重新实例化 95% 相似的对象的痛苦,您可以创建一个Builder变体来生成与现有实例略有不同的实例一种简短而优雅的方式。类似的东西ContactInfo.BuildFrom(oldContactInfo).WithPrimaryAddress(newPrimaryAddress)

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

于 2012-12-12T17:12:03.030 回答