假设我们有受 CQRS 启发的架构,其中包含命令、领域模型、领域事件、读取模型 DTO 等组件。
当然,我们可以在我们的领域模型中使用值对象。我的问题是,它们是否也可以用于:
- 命令
- 活动
- DTO
我还没有看到在上述组件中使用值对象 (VO) 的任何示例。相反,使用原始类型。也许这只是简单的例子。毕竟,我对在 DDD 中使用 VO 的理解是它们充当了整个应用程序的粘合剂。
我的动机:
命令。
假设用户提交了一个包含地址字段的表单。我们有地址值对象来表示这个概念。在客户端构建命令时,无论如何我们都应该验证用户输入,当它格式正确时,我们可以在那里创建地址对象并用它初始化命令。我认为无需将 Address 对象的创建委托给命令处理程序。
领域事件。
领域模型已经根据值对象进行操作,因此通过使用 VO 发布事件而不是将它们转换为原始类型,我们可以避免一些映射代码。我很确定在这种情况下使用 VO 是可以的。
DTO。
如果我们的查询端 DTO 可以包含值对象,则可以提供更多的灵活性。例如,如果我们有 Money 对象,我们可以选择以 EUR 或 USD 显示它,无需更改读取模型。