首页 文章

CQRS - 允许从写入端调用读取端吗?

提问于
浏览
19

我开始阅读有关CQRS的内容,我有点困惑 .

是否允许在写入端调用读取端以获取其他信息?

http://cqrs.nu/Faq/command-handlers这里他们说这是不允许的,但在cqrs旅程代码中,我发现他们调用了一个服务'IPricingService',它在内部使用DAO服务类 .

那么我必须做些什么才能在我的聚合根中获得额外的信息?

2 回答

  • 2

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

    由于我得到了一些关于这个答案的downvotes,我需要指出,我写的是模式中的既定做法 . 读取侧不访问写入侧,写入侧也不从读取侧获取数据 .

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

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

  • 22

    CQRS常见问题解答(http://cqrs.nu/Faq)建议:

    “我如何在有限的上下文之间进行通信?

    仅限于其公共API . 这可能涉及订阅来自另一个有界上下文的事件 . 或者一个有界的上下文可以像另一个的常规客户端一样,发送命令和查询 . “

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

相关问题