事件源域模型中是否有值对象的位置?
让我们将值对象定义为具有不可变状态的对象,它保护其不变量并且没有特定的标识符。
在这种情况下,事件源域模型是完全或部分事件源的域,这意味着它的当前状态可以通过应用过去发生的所有事件来派生。事件本身被认为是不可变的,即使随着时间的推移也是如此。
关于在事件中使用值对象的有效性已经发生了争论- 这个问题稍微更进一步:值对象在事件源域中是否有一席之地?
使用值对象的(潜在)问题是,以收紧不变量的方式改变域变得相当棘手。
此场景的一个示例是拥有一个Username
值对象,唯一的限制是名称必须介于 2 到 16 个字符之间。
虽然这种方法已经运行良好一段时间了,但该企业决定只允许使用至少 5 个字符的用户名。迁移期开始,名称少于 5 个字符的用户将被要求更新其名称。
可以说这个过程是成功的,纠正事件被应用,每个人都很高兴。我们收紧了对值对象的限制,Username
要求至少 5 个字符。
有一段时间每个人都很高兴,但后来我们发现快照有问题并重播所有事件。
现在,我们的Username
对象面临一个异常:通过加载历史数据,我们破坏了域的不变量。
值对象的规则具有追溯力- 这是否使它们本质上不适合事件溯源?是否值得应用值对象的版本控制?有没有更简单的方法来避免此类问题?