在CQRS模式中,应该在域服务或命令处理程序中工作

本文关键字:服务 工作 命令处理程序 CQRS 模式 | 更新日期: 2023-09-27 18:26:22

域服务是否应该注入其他域服务并在彼此之间执行工作,并使命令处理程序变为哑。或者,域服务是否应该是哑的(仅用于连接存储库屏障),并且大部分工作都在commandhandler中完成?这里的最佳实践是什么。。。

在CQRS模式中,应该在域服务或命令处理程序中工作

我想在域对象中添加所有业务逻辑(如果功能不适合对象,还可以添加域服务),并使用命令处理程序处理以下内容:

  • 实例化域对象并在其上运行方法
  • 在域服务上运行方法
  • 提供对域对象的依赖性
  • 管理数据库事务

您可以查看洋葱架构,我猜您的域服务在域模型中,命令处理程序在应用程序服务中。

CommandHandlers可以被视为应用程序的用例,因此它们的功能是协调对存储库、域服务和域模型的访问。

如果您开始在彼此内部注入域服务,则会开始将它们耦合,并失去每个服务的单一责任。

我的答案是让commandHandler处理用例中所需的域服务和模型的执行,这样你就可以自由地编写任何新命令,而不必处理那些充满逻辑的域服务,这些逻辑属于用例,而不完全属于域本身。

如果您的1服务依赖于其他服务,则意味着您犯了一些设计错误。如果是这种情况,那么只需移动您想要共享的代码就是其他共享类库,这样两个服务就可以在不依赖于其他的情况下使用它

我不建议将所有逻辑都放入命令处理程序中,因为域的许多部分无法从域外类中设置,所以我建议只在命令处理程序中编写后续工作和业务逻辑(而不是核心)