CQRS中的值对象-使用位置

问题描述 投票:36回答:5

假设我们拥有受CQRS启发的体系结构,其组件包括命令,域模型,域事件,读取模型DTO。当然,我们可以在域模型中使用值对象。我的问题是,它们是否也应用于:

  1. 命令
  2. 事件
  3. DTO

我还没有看到在上述组件中使用值对象(VO)的任何示例。而是使用原始类型。也许只是简单的例子。毕竟,我对在DDD中使用VO的理解是,它们是整个应用程序的粘合剂。

我的动机:

命令。假设用户提交了一个包含地址字段的表单。我们有地址值对象来表示这个概念。在客户端中构造Command时,无论如何我们都应该验证用户输入,并且当其格式正确时,我们可以在那里创建Address对象并使用它初始化Command。我看到不需要将Address对象的创建委托给命令处理程序。

域事件。域模型已经根据值对象进行操作,因此通过使用VO发布事件而不是将它们转换为原始类型,我们可以避免使用某些映射代码。我很确定在这种情况下可以使用VO。

DTO。如果我们的查询端DTO可以包含值对象,则可以提供更多的灵活性。例如,如果我们有Money对象,则可以选择以EUR或USD显示它,而无需更改读取模型。

domain-driven-design dto cqrs value-objects
5个回答
26
投票

好吧,我改变了主意。我最近一直在尝试处理VO,并且在观看了此http://www.infoq.com/presentations/Value-Objects-Dan-Bergh-Johnsson之后为我澄清了几件事。

命令和事件是消息(而不是对象,对象是数据+行为),在某些方面与DTO相似,它们传达有关事件的数据,而它们本身不封装任何行为。

值对象根本不像DTO。它们是一个域表示形式,并且与其他所有域表示形式一样,它们一般都具有丰富的行为。

命令和事件分别将信息传递到域中和从域传递出去,但是它们本身并不封装任何行为。从这个角度看,在内部传递VO似乎是错误的,可能是违反上下文。

解释Oren(尽管他指的是nHibernate和WCF)“不要通过网线发送您的域名”。http://ayende.com/Blog/archive/2009/05/14/the-stripper-pattern.aspx

如果您想传达一个值对象,那么我建议传递必要的必要属性来代替在其中重构VO。

原文(后代):

如果您询问值对象是否可以通过域模型传递给事件或通过命令传递,我确实看不到前者有什么大问题,尽管后者可能违反了聚合根的某些规则是价值的“所有者”。

那个值对象表示诸如颜色之类的概念。您没有拥有绿色,您是否[[有绿色。通过传递此命令告诉您绿色的命令,似乎没有本质上的错误。从DDD读取有关聚合根模式的章节可以很好地解释实体和值对象,值得多次阅读。


4
投票
我说这是个坏主意。

3
投票

0
投票

0
投票
© www.soinside.com 2019 - 2024. All rights reserved.