基于MediatR与洋葱架构的CQRS处理器:用Service还是Repository?
关于CQRS命令处理器依赖与Repository使用的问题解答
1. CreateOrder命令是否应依赖Product Service而非ProductRepository?
在洋葱架构和CQRS的设计原则下,更推荐依赖Product Service而非直接依赖ProductRepository,原因如下:
- 分层职责清晰:Repository属于基础设施层,仅负责数据的CRUD操作;而Product Service(通常是领域服务或应用服务)封装了产品相关的业务逻辑(比如库存扣减、价格校验等)。命令处理器属于应用层,职责是协调业务流程,而非直接操作数据持久化细节。
- 业务逻辑内聚:把产品相关的业务规则集中在Product Service中,避免在多个命令处理器中重复编写相同逻辑,便于维护和复用。
- 降低耦合:命令处理器无需了解产品数据的存储细节,只需要调用Service提供的业务方法即可,后续若产品的持久化方式变更,不会影响命令处理器的逻辑。
如果你的CreateOrder操作需要对产品执行业务操作(比如扣库存),一定要通过Product Service来完成;如果只是单纯查询产品信息,也建议通过Service封装,保持依赖的一致性。
2. 是否应该在CQRS命令处理器中使用Repository?
可以使用,但要严格控制使用场景:
- 在CQRS的命令端(写侧),命令处理器的核心职责是触发领域行为、协调业务流程,最终通过Repository完成领域对象的持久化。比如你代码中创建Order实体后,通过
IOrderRepository.Add保存,这是完全合理的——Repository是基础设施层的抽象,用于将领域对象持久化,符合洋葱架构“内层依赖外层抽象”的依赖方向。 - 但要避免在命令处理器中编写业务逻辑,Repository只能用于完成数据持久化操作,复杂的业务规则应该放在领域实体或领域服务中。比如不能在命令处理器里直接通过ProductRepository修改库存,而应该调用Product Service的扣库存方法,由Service处理业务规则后再操作Repository。
- 若命令涉及跨多个聚合根的操作,建议通过应用服务或领域服务来协调,不要让命令处理器直接调用多个Repository,保持命令处理器的简洁性,将业务逻辑内聚在合适的层级。
总结:命令处理器可以使用Repository做持久化,但不能让Repository承担业务逻辑的职责,始终遵循分层架构的职责边界。
内容的提问来源于stack exchange,提问作者Serkan Çamkerten
相关产品推荐
相关产品推荐

