小编CKK*_*CKK的帖子

DDD 和 CQRS:从单个命令处理程序使用多个存储库?

简单电子商店的典型示例。

假设用户将一些商品添加到购物篮并单击“结帐”。发出“创建订单”命令。现在,在实际创建状态为“预计付款”的订单记录以及数据库中相应的订单行之前,我们必须检查用户选择的商品是否仍然可用(也许某些商品在用户将其添加到购物篮时可用)但不再是了)。我们还必须保留它们,这样它们就不会在用户仍在结帐时突然消失。

所以我的问题是如何执行这个“检查和保留”例程?在我看来,我有多种选择:

  • 在“创建订单”命令处理程序中,用于ProductStockRepository保留产品,然后在成功后用于OrderRepository创建订单。这意味着,我们在单个处理程序中使用多个存储库。
  • 不要ProductStockRepository直接在“创建订单”处理程序中使用,而是创建一个ProductStockService并在其上调用方法来检查和预订产品。我们仍然在单个处理程序中使用多个存储库,但库存存储库的使用是抽象的。
  • 创建内部“储备产品”命令并从“创建订单”命令处理程序内部调度并等待它。
  • “结账”按钮发送“预订产品”命令,而不是“创建订单”。在“保留产品”处理程序中,我们尝试保留产品,并在成功时调用“保留产品”域事件。相应的事件处理程序被触发,我们在其中创建一个订单。
  • 还有其他方法吗?

这不是关于如何最好地建模电子商店结账流程的问题。以上只是一个例子。我想在许多不同的应用程序中可能会有许多类似的场景。

domain-driven-design cqrs

4
推荐指数
1
解决办法
1998
查看次数

Elixir 中的所有内容都是引用类型吗?

阅读 Elixir 不变性以及它如何尽可能避免内存复制,这似乎是唯一可能的解释,但我还没有在任何地方看到它明确说明。例如,当将一个新元素添加到一个列表时,它被描述为该操作恰好需要 n 步,其中 n 是列表的长度,但它只是对原始元素进行浅拷贝。所以我的假设是:

假设我们有一个列表 [1, 2, 3, 4]。它由 4 个节点组成,但节点本身不包含值。1、2、3、4 存储在其他地方,每个节点都包含对相应值的引用,以及对下一个节点的引用。当我们将 10 添加到列表中时,不仅创建了一个而是实际上创建了五个新节点,因为在原始列表中,数字 4 的节点必须将“nil”作为其“下一个”引用,但在新列表中,节点数字 4 必须有“next”指向新创建的数字 10 节点。所以它不能重复使用。这反过来意味着数字 3 的节点也不能重用,等等。所以创建了五个新节点,但前四个是浅拷贝,这意味着它们指向与原始节点完全相同的内存位置节点。

我刚才描述的有意义吗?

elixir

3
推荐指数
1
解决办法
93
查看次数

标签 统计

cqrs ×1

domain-driven-design ×1

elixir ×1