首页 文章

从CQRS访问Web服务

提问于
浏览
8

假设我有一个基于CQRS的系统,我的域需要来自外部Web服务的一些数据来做出决定 . 我该如何正确建模?

我可以想到两个选择:

  • 命令处理程序运行域逻辑,域本身调用Web服务 . 一旦获得响应,它就会将适当的事件附加到当前聚合并存储它们 . 该域基本上“等待”Web服务返回 .

  • 命令处理程序运行域逻辑,域立即发出域内部更多数据所需事件 . 进程管理器对此作出反应,与Web服务进行通信,对结果做出反应,并在前一个聚合上创建另一个命令,基本上是诸如继续之类的事情 .

哪种方法“更好”,或者都是错误的,我应该采用完全独立的方式?基本上,我对选项1很好,因为我认为这基本上只是一个长期运行在域内的计算,但不知何故,“等待”的想法让我感到恼火 .

我该怎么办?

1 回答

  • 7

    我倾向于像对待物理计算器那样考虑我的域名 . 它需要输入并产生输出 . 该输出可以作为事件存储或发出 . 因此,在数据中,会发生一些行为,而数据则会出现 . 所以非常关注行为 .

    您的选项(1)场景导致了几个关于将实体注入服务或存储库(或者,我猜,反腐败层)的DDD讨论 . 一般的共识是应该避免它,并且应该选择双重调度 . 关键是域然后需要更多信息,它需要最初传入或者需要获取 . 在我的计算器中类比,获取更多数据就像计算器提示您输入更多数据 .

    如果你选择选项(1)那么调用域的任何东西都需要处理任何网络调用失败才能重试 .

    如果你选择(2)你使用像服务总线这样的东西,可能还有各种各样的流程引擎(比如saga或工作流),很可能服务总线处理程序或流程引擎将处理失败和重试 .

    我认为一种解决方案不一定比另一种更好,而是“不同” . 我会选择你感觉舒服的任何东西,如果你有基础设施以某种方式处理故障/重试,那么我会选择最容易被该基础设施支持的选项 .

    希望有帮助:)

相关问题