如果目前确实没有必要,是否愿意将大命令分解为更小的命令?

Favor breaking up big commands into smaller ones if not actually necessary at present time?

我正在为一些商店实现后端,它完全写在前端,只有最终状态(数据)被发送到后端。我正在尝试将 DDD 与 CQRS/ES 一起使用。

快乐场景用例(例如,广义):

现在,因为这一切都发生在前端,我现在唯一的传递机制是来自 GraphQL 的一些原始数据。我应该在应用程序层中使用方法 create($someGraphQLData); 一些 CreateNewOrderFromGraphQL 吗?只是创建相对较大的 CreateNewOrderCommand(因为它需要包含地址、CartItems、促销代码等)并通过命令总线将其传递到我创建整个订单的域模型中?

或者我是否应该像在前端那样考虑我的域模型,然后在我的 CreateNewOrderFromGraphQL 中将大的原始 GraphQL 数据分解为单独的命令,如 CreateCartCommand、AddItemToCartCommand、CreateOrderCommand(其中包括购物车 ID、地址id,也许还有一些细节)然后按顺序调用它们?

我应该考虑哪些因素?

因为你在前端有很多行为,而前端是不可信的,你也被迫在后端复制行为。 所以,让我们看看你在这里有什么。

我认为您应该将域模型(命令端)设计为 UI 不可知,其中 GraphQL 接口是一种 UI。

因此,如果用户存在,这是您在请求的授权阶段必须要做的检查。如果用户不存在,则客户端请求不应到达域模型,它应该被应用层(或介于 UI 和域之间的类似层)拒绝。

购物车可以像另一个 Aggregate 一样完成。它应该有像 CreateCartCommandAddItemToCartCommand 这样的命令。或者它可以作为 CRUD 来完成,如果没有真正的不变量。

然后,OrderAggregate 可以有一个 PlaceOrderCommand,以购物车中的商品作为参数,还有一个 AddressIdUserId 已经被应用程序检查过是否存在层。 Aggregate 保护它自己的不变量,例如 total price <= some max value 或检查库存状态(以防库存不在另一个 BC 中)。