Web services 从CQRS访问web服务

Web services 从CQRS访问web服务,web-services,domain-driven-design,integration,cqrs,Web Services,Domain Driven Design,Integration,Cqrs,假设我有一个基于CQRS的系统,我的域需要来自外部web服务的一些数据来做出决策。如何正确建模 我可以想出两个选择: 命令处理程序运行域逻辑,域本身调用web服务。一旦得到响应,它就会将适当的事件附加到当前聚合并存储它们。域基本上“等待”web服务返回 命令处理程序运行域逻辑,域立即发出域内部“需要更多数据”事件。流程管理器对此作出反应,与web服务对话,对结果作出反应,并在前一个聚合上创建另一个命令,基本上是continue之类的命令 哪种方法是“更好的”,或者两者都是错误的,我应该采取完全不

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

我可以想出两个选择:

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

  • 命令处理程序运行域逻辑,域立即发出域内部“需要更多数据”事件。流程管理器对此作出反应,与web服务对话,对结果作出反应,并在前一个聚合上创建另一个命令,基本上是continue之类的命令

  • 哪种方法是“更好的”,或者两者都是错误的,我应该采取完全不同的方式?基本上,我同意选项1,因为我认为这基本上只是域内的一个长时间运行的计算,但不知何故,“等待”的想法激怒了我


    我该怎么办?

    我倾向于像对待物理计算器一样思考我的领域。它接受输入并产生输出。该输出可以作为事件存储或发出。因此,数据进入时,会发生一些行为,然后数据出来。所以非常关注行为

    您的选项(1)场景导致了关于将服务或存储库(或者,我猜,反腐败层)注入实体的一些DDD讨论。普遍的共识是应该避免这种情况,人们应该选择(比如)双重派遣。关键是域需要更多的信息,或者需要最初传入,或者需要获取。在我的计算器类比中,获取更多数据就像计算器提示您输入更多数据一样

    如果使用选项(1),则无论调用域的是什么,都需要处理任何web调用失败,以便重试

    如果您使用选项(2),其中您使用了服务总线和流程引擎之类的东西(比如saga或工作流),那么很可能是服务总线处理程序或流程引擎正在处理故障和重试

    我认为一种解决方案不一定比另一种“更好”,而是“不同”。我会选择任何您觉得合适的方式,如果您的基础架构已经以某种方式处理了故障/重试,那么我会选择该基础架构最容易支持的选项

    希望有帮助:)