如果命令(CQRS)是UI的动作,它们是否属于表示层?

时间:2017-08-05 00:24:21

标签: php cqrs

我应该在Command中注入EventBusController,还是应该在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>

但是,如果命令属于表示层,则工作流程为:

表示层(请求) - >域(服务) - >表示层(命令和命令处理程序) - >域名 - >表示层(响应)

1 个答案:

答案 0 :(得分:1)

CQRS借鉴了的许多想法。当Eric Evans最初在the blue book中描述DDD时,他正在使用三层架构:应用程序/域/持久性。

一个关键的抽象是应用程序和域之间的接缝,称为存储库。在该边界处,交互通常看起来像

$user = repository->getById($id)
$user->create($name, $lastName)
repository->save($user)

请注意,所有实际域逻辑都隐藏在$ user后面。

如果您想获取该代码块,并将其包装在“服务”中,那很好。但它通常被认为是应用程序服务,而不是域服务。请参阅Khorikov获取overview of the distinctionJimmy Bogard's take

您可能需要考虑的事项:http请求等命令基本上是消息。在应用程序生命周期中,这些消息的定义可能会发生变化。您需要考虑的是将代码更改为match the new message schema需要多少不同的地方。