【发布时间】:2022-01-11 06:00:24
【问题描述】:
我正在设计我的第一个 REST-API,并且正在努力为具有嵌套对象的 Cart 聚合设计 API:
购物车 1->n 子购物车 1->n CartItem.
购物车聚合作为一个整体保存。每次将商品放入购物车时,必须计算各种折扣,这些折扣取决于其他 CartItems,甚至来自其他 SubCarts。因此,客户端应用需要接收包含所有嵌套对象的完整购物车聚合。
Evens 在他的 DDD 书中说“...根是 AGGREGATE 的唯一成员,允许外部对象持有对...的引用”。
我理解大意,但不清楚参考是什么意思。一些文章谈到内存对象引用,另一些文章也谈到 id 引用。如果用户即想要增加 CartItem 的数量,则 UI 必须有一种方法来识别购物车中的项目。它需要有一些 id/reference。否则购物车怎么知道应该增加什么物品的数量。埃文斯的参考是什么意思?它的措辞非常混乱。
由于所有命令都通过后端的购物车聚合,我想知道这是否也应该应用于 REST API。由于我缺乏经验,我不知道一种或另一种解决方案会有什么问题或副作用(即缓存、安全性)?为什么一个人更喜欢其中一个?
例如,对于更新 CartItem 的数量,我看到以下选项:
-
修补购物车/{id}/subcarts/{subcart_id}/cartitems/{cartitem_id}
-
PATCH 购物车/{id}/{subcart_id}/{cartitem_id}
-
PATCH /carts/{id}?subcart={subcart_id}&cartitem={cartitem_id}
-
PATCH 购物车/{id} 在正文中包含 subcart_id 和 caritem_id
我看到 GIT API 在某些情况下使用了选项 2 的较短形式。什么时候应该选择选项 1 而不是选项 2?
对于选项 3 和 4,返回新的 Cart 对象是很自然的,因为 PATCH 可能导致折扣。
使用选项 1 和 2,在 CartItem 的 PATCH 之后返回 Cart 对象似乎不是 RESTful。返回可能是 204,然后客户端必须再次在购物车上发送 GET,从而导致两次调用。
感谢您的帮助和见解。
【问题讨论】:
标签: rest reference aggregate domain-driven-design nested-object