web-services - 从 CQRS 访问 Web 服务

标签 web-services domain-driven-design integration cqrs

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

我可以想到两个选择:

  • 命令处理程序运行域逻辑,域本身调用 Web 服务。一旦得到响应,它将适当的事件附加到当前聚合并存储它们。域基本上“等待”Web 服务返回。
  • 命令处理程序运行域逻辑,域立即发出域内部的更多数据需要事件。流程管理器对此使用react,与 Web 服务对话,对结果使用react,并在前一个聚合上创建另一个命令,基本上是诸如 continue 之类的命令。

  • 哪种方法“更好”,或者都是错误的,我应该遵循完全不同的方法?基本上,我对选项 1 没意见,因为我认为这基本上只是域内的长时间运行的计算,但不知何故,“等待”的想法让我很恼火。

    我该怎么办?

    最佳答案

    我倾向于将我的领域视为我对物理计算器的看法。它接受输入并产生输出。该输出可以作为事件存储或发出。所以在数据中,一些行为发生了,数据出来了。所以非常关注行为。

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

    如果您使用选项 (1),那么调用该域的任何内容都需要处理任何网络调用失败才能重试。

    如果您使用选项(2),您使用服务总线之类的东西,并且可能使用各种流程引擎(例如 saga 或工作流),那么服务总线处理程序或流程引擎很可能会处理失败和重试。

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

    希望有帮助:)

    关于web-services - 从 CQRS 访问 Web 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21704465/

    相关文章:

    web-services - SSIS Web服务任务超时值

    domain-driven-design - 简洁的架构和 DDD 丰富的模型验证

    domain-driven-design - 领域模型设计

    svn - 是否存在 git 的 svn 前端

    angularjs - 如何在 Angular 1 应用程序中嵌入独立的 Angular 2 应用程序

    web-services - Web 服务可用于获取给定坐标可见的卫星数量

    javascript - 启用 CORS 的正确位置在哪里?

    asp.net - IQueryable & Repositories - 拿 2 个?

    Java/PayPal 集成指向错误的端点

    c# - 将 Json 字符串从 MVC 操作反序列化为 C# 类