控制器是在应用层还是基础设施层?我是否应该在 Clean Architecture 中使用控制器?

Are controllers inside the application layer or infrastructure layer? Should I even use controllers in Clean Architecture?

据我所知,Clean Architecture/DDD 指出您的用例可以由任何东西触发,可以是 HTTP 请求或 GUI,对吗?

我正在尝试模仿它,但我不确定我是否正确地做到了。

在我的 infrastructure 文件夹中,我有路由器。例如:

import express from 'express'
import UserController from '../controllers/user_controller.js'
import ExpressRouterAdapter from './ExpressRouterAdapter.js'

export default function UsersRouter () {
  const router = express.Router()

  router.route('/:username').get(ExpressRouterAdapter.adapt(UserController.getUser))

  return router
}

ExpressRouterAdapter只是一个将Express请求转换为简单的httpRequest JS对象的适配器)

这是我的 GetUser 控制器:

export class GetUser {
  constructor ({ FindUserService }) {
    this.findUser = FindUserService
  }

  async handle (httpRequest = {}) {
    try {
      const { username } = httpRequest.params

      if (!username) {
        return {
          statusCode: 400,
          body: 'Missing username parameter.'
        }
      }

      const user = await this.findUser.execute(username) 

      // ...

我有几个问题:

  1. 我什至应该有控制器吗?路由器应该直接将它指向 use-case/service 吗?
  2. ^^ 我之所以这样问是因为我的控制器确实以 HTTP 为中心。例如,其中一些被称为:PostUserGetUserDeleteUser。所以我猜它们应该在 infrastructure 文件夹中,对吧?

我猜只有当您的交付机制是 Web 应用程序时才使用控制器,对吗?

你是对的。与 DDD 没有任何关系,因为 DDD 是关于上下文和语言的,但对于干净的架构、端口和适配器来说,这是正确的想法。

通常情况下,你会有这样的结构:

因此,您的应用程序公开了一个代表端口的 API,您可以连接不同的 edge 组件,这些组件实现不同类型的物理传输协议以与您的申请。