【发布时间】:2012-03-25 02:59:04
【问题描述】:
我仍在努力思考如何将 DDD 以及最近的 CQRS 应用于实际的生产业务应用程序。就我而言,我正在开发一个库存管理系统。它作为基于服务器的应用程序运行,通过 REST API 向多个客户端应用程序公开。我的重点一直是领域层以及 API 和要遵循的客户端。
域的命令端用于创建新订单并允许修改、取消、将订单标记为已履行和已发货/已完成。当然,我有一个查询,它从存储库返回系统中的订单列表(作为只读的轻量级 DTO)。另一个查询返回仓库员工用来从货架上拉出物品以完成特定订单的 PickList。为了创建 PickList,必须对计算、规则等进行评估,以确定哪些订单可以被履行。例如,如果所有订单行项目都有库存。我需要阅读相同的订单列表,遍历列表并应用这些规则和计算来确定哪些项目应包含在 PickList 中。
这不是一个简单的查询,那么它如何适合模型?
更新
虽然我可以维护(存储)一组 PickList,但在员工检索下一个 PickList 之前,它们确实是动态的。考虑以下场景:
收到当天的第一个订单。我可以引发一个触发 AssemblePickListCommand 的域事件,该命令应用所有规则和逻辑来为该订单创建一个或多个 PickList。
收到第二份订单。事件处理程序现在应该用一个或多个针对两个挂起订单优化的新 PickList 替换原始 PickList。
收到第三份订单后也是如此。
假设我们现在在“队列”中有两个 PickList,因为优化规则会拆分列表,因为组件位于仓库的两端。
仓库员工 #1 请求一个 PickList。第一个 PickList 被拉出并打印出来。
收到了第四个订单。和以前一样,处理程序从队列中删除第二个 PickList(仅剩下一个),并根据第二个 PickList 和新 Order 重新生成一个或多个 PickList。
PickList 'assembler' 将在收到新订单时重复此逻辑。
我的问题是,在更新 PickList 队列时请求必须阻塞,或者我有一个与客户想要的行为背道而驰的最终一致性问题。每次他们请求 PickList 时,他们都希望根据当时收到的所有订单对其进行优化。
【问题讨论】: