我有 2 个字段 id 和 language_name 的语言表。我可以将其视为价值对象吗?
防爆记录:1 EN 2 DE 3 TR
一旦这些值是不可变的,我认为我不需要给它们 Id 并将其作为直接在数据库中表示的实体。
我有 2 个字段 id 和 language_name 的语言表。我可以将其视为价值对象吗?
防爆记录:1 EN 2 DE 3 TR
一旦这些值是不可变的,我认为我不需要给它们 Id 并将其作为直接在数据库中表示的实体。
您可以将它们视为值对象,但您不必以 DDD 方式考虑所有内容。
根据 Martin Fowler 的定义:
当我们使用域模型时,我们使用它是因为它包含复杂的域逻辑。将此域逻辑分类为:
验证:检查输入是否有意义以及对象是否适合进一步的操作。 结果:启动一些将改变世界状态的行动
推导:根据我们已有的信息找出一些信息
ValueObject 擅长验证和推导。
另一方面,语言表通常用于解决 i18n 问题(ui/query conern)。一般来说,这里没有领域逻辑。这种特性很容易以简单的 CRUD 风格实现,最好是这样。考虑在 DDD 中添加许多约束,例如存储库只能返回聚合,或者您只能通过聚合修改本地实体。例如,用户编辑产品,添加英文描述和德文描述。可以将产品建模为聚合,将描述建模为值对象,但这不会增加太多价值并且有时会很烦人(现在,英语编辑器和德语编辑器无法同时编辑产品以对聚合进行并发修改)。
但是,如果产品聚合上有一些真正的域验证和派生怎么办?比如库存和定价。这就是有界上下文发挥作用的地方。可以同时拥有在 DDD 中建模的库存/定价有界上下文和在 CURD 中建模的产品描述上下文。