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

In CQRS pattern, should work go in domain services or command handlers

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

我会说在域对象中添加所有业务逻辑(如果功能不适合对象,还包括域服务)并使用命令处理程序来处理类似的事情:

  • 实例化领域对象和运行方法,
  • 运行 域服务方法,
  • 提供对领域对象的依赖,
  • 管理数据库事务,
  • ...

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

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

如果你开始在彼此内部注入域服务,你就会开始将它们耦合起来,并失去每个人的单一职责。

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

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

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