我有一个聚合根“Order”,它有许多内部设置其“状态”字段的方法:
可用的操作取决于订单的当前状态(例如,如果它已经被搁置,则不能搁置)。问题是我需要提供一个查询来告诉 UI 哪些命令可用,以便我可以隐藏否则会抛出
InvalidOperationException
的操作。 .我如何以最小的 DRY 违规来做到这一点?
最佳答案
最简单的解决方案是将当前状态与可用转换一起转换到读取/查询模型中,然后将其与要显示的数据一起选择。
例子:PlaceOnHoldCommand
结果 OrderPlacedOnHoldEvent
其中(除了放在 EventStore 中)由 OrderTransitionsEventHandler
发布和处理它将可用转换非规范化到与 Order 关联的数据库表。客户端选择可用的转换并相应地采取行动(隐藏不可用的按钮或类似的东西)。
这当然是一种选择。但是,不要指望不会有任何重复。 CQRS 有助于管理复杂性,有时这意味着会发生轻微的 DRY 违规。
关于domain-driven-design - 在 CQRS 中,如何将聚合上允许的方法列表传达给 UI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7276396/