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

kib*_*ibe 1 domain-driven-design node.js express 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
}
Run Code Online (Sandbox Code Playgroud)

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

这是我的GetUser控制器:

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
}
Run Code Online (Sandbox Code Playgroud)

我有几个问题:

  1. 我什至应该有控制器吗?路由器是否应该将其直接指向用例/服务?
  2. ^^ 我之所以这么问是因为我的控制器确实以 HTTP 为中心。例如,其中一些被称为:PostUser, GetUser, DeleteUser。所以我猜他们应该在infrastructure文件夹内,对吧?

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

Ale*_*rev 6

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

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

在此处输入图片说明

因此,您的应用程序公开了一个表示端口的 API,您可以连接实现不同类型物理交付协议的不同边缘组件以与您的应用程序通信。