我应该在Command
中注入EventBus
和Controller
,还是应该在Domain Service
中注入Controller
,让Domain Service
创建{ {1}}并发送给Command
?
示例:
Command Bus
或者让它调用域名服务会更好吗?
// CreateUserController.php
// CreateUserController.php
public function __construct (CreateUserCommand $command, CommandBus $cm) {
...
}
public function createAction(Request $request) {
// data validation
$this->command->setData($request->getData());
try {
$this->cm->handle($this->command)
} catch (Exception $e) {
return new Response(500) // assume Response accepts http code
}
return new Response(200);
}
这似乎更好,因为控制器没有责任填充命令并调用命令处理程序,它只是通过Form验证所需的输入是否存在,然后调用域服务层。 / p>
但是,如果命令属于表示层,则工作流程为:
表示层(请求) - >域(服务) - >表示层(命令和命令处理程序) - >域名 - >表示层(响应)
答案 0 :(得分:1)
CQRS借鉴了domain-driven-design的许多想法。当Eric Evans最初在the blue book中描述DDD时,他正在使用三层架构:应用程序/域/持久性。
一个关键的抽象是应用程序和域之间的接缝,称为存储库。在该边界处,交互通常看起来像
$user = repository->getById($id)
$user->create($name, $lastName)
repository->save($user)
请注意,所有实际域逻辑都隐藏在$ user后面。
如果您想获取该代码块,并将其包装在“服务”中,那很好。但它通常被认为是应用程序服务,而不是域服务。请参阅Khorikov获取overview of the distinction或Jimmy Bogard's take。
您可能需要考虑的事项:http请求等命令基本上是消息。在应用程序生命周期中,这些消息的定义可能会发生变化。您需要考虑的是将代码更改为match the new message schema需要多少不同的地方。