2015-07-10 49 views

回答

19

CQRS旅程不应被视为手册。这只是一些团队与CQRS战斗的故事,并且仅限于使用Microsoft堆栈。本身你不应该在命令处理程序或域逻辑中使用你的读取模型。但是您可以从客户端查询您的读取模型以获取您的命令所需的数据并验证命令。

既然我对这个答案有了一些看法,我需要指出的是,我写的是模式中的惯例。读取侧都不访问写入侧,写入侧不从读取侧获取数据。

然而,“客户”的定义可能是讨论的主题。例如,我不相信面向公众的JS浏览器应用程序是一个合适的“客户端”。相反,我会使用我的REST API层作为CQRS中的“客户端”,而Web应用程序将仅仅是此客户端的UI层。在这种情况下,REST API服务调用处理将成为合法的读取方读取器,因为它需要验证所有发送的UI层以防止伪造并验证一些业务规则。当这项工作完成后,命令形成并发送到写入端。验证和其他一切都是同步的,然后命令处理是异步的。

更新:根据下面的一些分歧,我想指向Udi's article from 2009谈论一般的CQRS,特别是命令和验证。

+2

我不同意。如果你需要你的命令包含处理程序需要验证你的命令的数据,那么你永远不会改变你的处理程序/域中的验证逻辑,而不会影响* client *。这清楚地向客户公开了太多的命令验证/领域知识,并且与客户仅仅想表达意图相矛盾。恕我直言,更好的解决方案是向您的聚合根提供一个'PricingService'接口(这是无处不在的语言的一部分),然后根据需要实现接口 - 这可能包括查询读取方。 –

+0

我将不得不继续这一个。 – JoG

+2

@AlexanderLanger这不是我发明的东西,这是模式的设计。你可能会发现可以从你的命令处理程序中查询读取的一面,但这不是所讨论的模式。如果您查看CQRS上的任何图表,您将永远看不到读取模型是由写入模式查询的。它只能由客户读取。 –

2

的CQRS FAQ(http://cqrs.nu/Faq)指出:

“我怎样才能限界上下文之间的沟通

独家在其公共API而言,这可能涉及订阅从另一个界上下文未来事件或?。一个有界的上下文可以像另一个常规客户那样行事,发送命令和查询。“

因此,尽管在一个BC内,不可能在写入端使用读取端,反之亦然,但另一个有界的上下文或服务可以。实质上,这将会像使用用户界面的人一样行事。