【问题标题】:CQRS and unit of work - one command for all the changes, or many commands + a save command?CQRS 和工作单元 - 一个命令用于所有更改,还是多个命令 + 一个保存命令?
【发布时间】:2019-12-30 11:14:39
【问题描述】:

在显示多个订单明细行的屏幕中,用户可以添加、更新或删除行或列,然后单击“保存”按钮以保存一笔交易中的所有订单更改.

选项1:创建一个命令(将由按钮的Clicking 事件创建),说UpdateOrderCommand,它具有复杂的内部数据结构,可用于所有更改。该命令会将更改应用到数据库表。 (因此 UI 部分代码将需要跟踪命令的所有更改。)

选项 2:创建 AddOrderLineCommandDeleteOrderLineCommandUpdateOrderLineCommandSaveOrderCommand。 UI 上的每个操作都会创建一个请求,“保存”按钮将调用SaveOrderCommand。但是,它需要一些有状态的服务来保存所有未保存的更改。

CQRS 惯用方法是哪一种?

【问题讨论】:

  • 您正在描述 CRUD 用例。 DDD 和 CQRS 没有任何关于如何做到这一点的秘诀。它们适用于业务用例,而不是用于保存、更新和删除。

标签: domain-driven-design cqrs command-query-separation


【解决方案1】:

这主要是一个基于偏好的问题,但我根据各种思考过程遵循了一些指导方针。

CQRS 应该是透明的

消费以这种方式更新/读取的数据的人不需要知道它是通过使用 CQRS 完成的。也许最终的一致性,但没有必要通过以某种方式暴露命令来表明它。

REST API 访问

当我创建命令来访问域时,它会容易得多。这只是资源和动词命名更容易。在这种情况下,我希望我的命令与功能相匹配。我不想让 100 个端点使用相同的保存所有命令。

在OOP的世界里,这也违背了单一职责,做一个好类。

无处不在的语言

您处于域驱动的世界。您的代码应使用相同的业务语言。 SaveAll 对业务没有任何意义,对新开发人员没有任何意义,对您来说可能也没有任何意义。

【讨论】:

  • 我更新了问题中的名称。现在没有通用的 SaveAll 命令
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-10
  • 2012-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多