Php 如果目前实际上没有必要的话,是否赞成将大命令分解为小命令?
我正在为一些商店实现后端,它完全写在前端,只有最终状态(数据)被发送到后端。我正在尝试将DDD与CQRS/ES一起使用 快乐场景用例(例如,一般化):Php 如果目前实际上没有必要的话,是否赞成将大命令分解为小命令?,php,domain-driven-design,cqrs,Php,Domain Driven Design,Cqrs,我正在为一些商店实现后端,它完全写在前端,只有最终状态(数据)被发送到后端。我正在尝试将DDD与CQRS/ES一起使用 快乐场景用例(例如,一般化): 给定该用户,Cart和CartItem存在 用户可以将类型为X的CartItem添加到购物车 用户可以指定(设置一些参数)carty项 用户可以添加类型为Y的CartItem 用户可以从他的地址中选择地址(创建地址是个问题) (公元前二世纪) 用户可以下订单 现在,因为这一切都发生在前端,所以我现在唯一的交付机制是来自GraphQL的一些原始
- 给定该用户,Cart和CartItem存在
- 用户可以将类型为X的CartItem添加到购物车
- 用户可以指定(设置一些参数)carty项
- 用户可以添加类型为Y的CartItem
- 用户可以从他的地址中选择地址(创建地址是个问题) (公元前二世纪)
- 用户可以下订单
我应该考虑什么 因为前端有很多行为,前端不可信,所以您不得不在后端复制行为。 那么,让我们看看你这里有什么 我认为您应该将域模型(命令端)设计成与UI无关的,其中GraphQL接口是一种UI 因此,如果用户存在,则在请求的授权阶段,您必须执行一项检查。如果用户不存在,则客户端请求不应到达域模型,应用层(或UI和域之间的类似层)应拒绝该请求 可以将购物车作为另一个
聚合。它应该有像CreateCartCommand
和AddItemToCartCommand
这样的命令。或者,如果没有真正的不变量,它可以作为积垢来处理
然后,OrderAggregate
可以有一个PlaceOrderCommand
,其中cart中的项目作为参数,应用层已经检查了存在的AddressId
和UserId
。这个Aggregate
保护它自己的不变量,比如total price你的不变量是什么?在什么条件下可以创建和放置订单
?您应该基于聚合的
不变量创建命令。@ConstantingAlBun订单可以创建,如果:1)给定id的用户存在2)给定id的地址存在3)购物车有效,则表示订单购物车中的每个CartItem都传递了自己的不变量。所以,我认为打破这一点更明智,所以我可以先创建购物车,然后一个接一个地添加项目,最后只需将购物车的id传递给订单。然后,我可能最终会在创建购物车(可能在许多步骤中)时报告特定项目的错误(但其他所有项目都可以处理ok),而不是不允许“使用给定的所有内容创建整个订单”?您无法控制前端吗?因为在DDD中,理想情况下,用户的意图与UI中的操作一直对应到后端。如果你不能做到这一点,我确实会尝试像你能做的那样工作,为你的前端创建一个外观,使前端看起来就像它自己在生成命令一样。如果有一天运气好的话,前端可以被更新/升级到理想状态,但是如果没有,你的后端也不会因此而受损。