domain-driven-design - 在 DDD 中,命令是严格同步的 API 调用吗?

标签 domain-driven-design

当我在 DDD 上下文中阅读有关 Command 的内容时,它通常被描述为 API 调用。

在此示例中,serviceA 向 serviceB 发送命令。

服务A -> 服务B

在我的理解中,命令是对某事的具体行动。因此从技术上讲,这也可以采用异步形式。也许在消息队列中发送命令消息。

服务A -> 队列 -> 服务B

命令是严格同步的 API 调用,还是可以异步?

最佳答案

领域驱动设计上下文中的命令:

命令 - 在领域驱动设计的背景下 - 代表系统中发生某些事情的意图,在执行后会导致一些期望的结果。因此它可以被看作是某个对象,其中包含命令接收者执行命令所需的所有信息。

因此,当在领域驱动设计中谈论命令时,没有技术定义或限制命令可以被触发和传输或者如何表示所需信息。。

命令应该首先从业务角度进行描述,以找出系统上下文中的什么或谁会触发它以及何时触发。以及命令执行后的预期状态。

命令可以被触发/传输,例如,可以通过以下方式:

  • 当用户点击网站上的按钮时执行一些同步 REST 请求
  • 向命令接收者(例如另一个微服务)的消息队列发送异步消息(例如从一个微服务)
  • 执行 gRPC 调用(例如从一个微服务到另一个微服务)
  • 单击桌面应用程序 UI 中的按钮
  • 执行计划的后台任务

业务上下文中的命令可以是,例如:

  • 在网上商店中查看当前的购物篮以发起订单
  • 在 stackoverflow 上投票和回答,并增加答案的投票

在领域驱动设计的上下文中如果命令是同步执行还是异步执行,这只是一些实现细节。重要的是,执行成功后,预期的结果就会发生。

执行同步 API 调用时,如果命令执行正常,触发命令的组件可以通过同步应答获取反馈

而在异步命令传输(如消息传递)中,您只会知道消息已传递到某个队列,但命令的成功执行必须以其他方式被感知。通过查询所涉及域实体的当前状态利用某种基于事件的机制(其中事件)在执行命令后发布,任何感兴趣的各方都可以订阅这些事件。

TL;DR

回到你的问题:

When I read about Command in the DDD Context, it is usually described as an API call.

API调用本身只是命令的技术数据表示和传输。

Are Commands strictly synchronous API calls, or can be asynchronous?

相同的命令可以以不同的方式触发(参见前面的示例)并以不同的方式再次传输。但无论如何触发或如何传输,它都必须包含相同的所需信息,并且在执行后将在整个系统中产生相同的期望结果。

所以,是的它当然也可以是异步的

关于domain-driven-design - 在 DDD 中,命令是严格同步的 API 调用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63289790/

相关文章:

nhibernate - 如何在 Fluent NHibernate 中建模此对象层次结构而不违反 DDD 原则?

domain-driven-design - 跨限界上下文的实体建模

domain-driven-design - DDD 处理随时间推移的聚合更新

java - 跨微服务的对象构建

domain-driven-design - 关于 ReadModels 和域的 DDD/CQRS 混淆

java - 使用构建器模式时防止静态注入(inject)

repository - 如何保存和加载值对象?

events - DDD 使用 NoSQL 处理限界上下文中多个聚合的最终一致性

domain-driven-design - CQRS + 没有 DDD 的事件溯源

language-agnostic - 使用 DDD 和 CQRS 处理域逻辑的重复