如果目前确实没有必要,是否愿意将大命令分解为更小的命令?
Favor breaking up big commands into smaller ones if not actually necessary at present time?
我正在为一些商店实现后端,它完全写在前端,只有最终状态(数据)被发送到后端。我正在尝试将 DDD 与 CQRS/ES 一起使用。
快乐场景用例(例如,广义):
- 鉴于 User、Cart 和 CartItem 存在。
用户可以将类型 X 的 CartItem 添加到购物车
用户可以指定(设置一些参数)CartItem Y
用户可以添加 Y 类型的 CartItem
用户可以从他的地址中选择地址(创建地址是个问题
另一个 BC)
用户可以下订单
现在,因为这一切都发生在前端,我现在唯一的传递机制是来自 GraphQL 的一些原始数据。我应该在应用程序层中使用方法 create($someGraphQLData); 一些 CreateNewOrderFromGraphQL 吗?只是创建相对较大的 CreateNewOrderCommand(因为它需要包含地址、CartItems、促销代码等)并通过命令总线将其传递到我创建整个订单的域模型中?
或者我是否应该像在前端那样考虑我的域模型,然后在我的 CreateNewOrderFromGraphQL 中将大的原始 GraphQL 数据分解为单独的命令,如 CreateCartCommand、AddItemToCartCommand、CreateOrderCommand(其中包括购物车 ID、地址id,也许还有一些细节)然后按顺序调用它们?
我应该考虑哪些因素?
因为你在前端有很多行为,而前端是不可信的,你也被迫在后端复制行为。
所以,让我们看看你在这里有什么。
我认为您应该将域模型(命令端)设计为 UI 不可知,其中 GraphQL 接口是一种 UI。
因此,如果用户存在,这是您在请求的授权阶段必须要做的检查。如果用户不存在,则客户端请求不应到达域模型,它应该被应用层(或介于 UI 和域之间的类似层)拒绝。
购物车可以像另一个 Aggregate
一样完成。它应该有像 CreateCartCommand
和 AddItemToCartCommand
这样的命令。或者它可以作为 CRUD 来完成,如果没有真正的不变量。
然后,OrderAggregate
可以有一个 PlaceOrderCommand
,以购物车中的商品作为参数,还有一个 AddressId
和 UserId
已经被应用程序检查过是否存在层。 Aggregate
保护它自己的不变量,例如 total price <= some max value
或检查库存状态(以防库存不在另一个 BC 中)。
我正在为一些商店实现后端,它完全写在前端,只有最终状态(数据)被发送到后端。我正在尝试将 DDD 与 CQRS/ES 一起使用。
快乐场景用例(例如,广义):
- 鉴于 User、Cart 和 CartItem 存在。
用户可以将类型 X 的 CartItem 添加到购物车
用户可以指定(设置一些参数)CartItem Y
用户可以添加 Y 类型的 CartItem
用户可以从他的地址中选择地址(创建地址是个问题 另一个 BC)
用户可以下订单
现在,因为这一切都发生在前端,我现在唯一的传递机制是来自 GraphQL 的一些原始数据。我应该在应用程序层中使用方法 create($someGraphQLData); 一些 CreateNewOrderFromGraphQL 吗?只是创建相对较大的 CreateNewOrderCommand(因为它需要包含地址、CartItems、促销代码等)并通过命令总线将其传递到我创建整个订单的域模型中?
或者我是否应该像在前端那样考虑我的域模型,然后在我的 CreateNewOrderFromGraphQL 中将大的原始 GraphQL 数据分解为单独的命令,如 CreateCartCommand、AddItemToCartCommand、CreateOrderCommand(其中包括购物车 ID、地址id,也许还有一些细节)然后按顺序调用它们?
我应该考虑哪些因素?
因为你在前端有很多行为,而前端是不可信的,你也被迫在后端复制行为。 所以,让我们看看你在这里有什么。
我认为您应该将域模型(命令端)设计为 UI 不可知,其中 GraphQL 接口是一种 UI。
因此,如果用户存在,这是您在请求的授权阶段必须要做的检查。如果用户不存在,则客户端请求不应到达域模型,它应该被应用层(或介于 UI 和域之间的类似层)拒绝。
购物车可以像另一个 Aggregate
一样完成。它应该有像 CreateCartCommand
和 AddItemToCartCommand
这样的命令。或者它可以作为 CRUD 来完成,如果没有真正的不变量。
然后,OrderAggregate
可以有一个 PlaceOrderCommand
,以购物车中的商品作为参数,还有一个 AddressId
和 UserId
已经被应用程序检查过是否存在层。 Aggregate
保护它自己的不变量,例如 total price <= some max value
或检查库存状态(以防库存不在另一个 BC 中)。