控制器是在应用层还是基础设施层?我是否应该在 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)
// ...
我有几个问题:
- 我什至应该有控制器吗?路由器应该直接将它指向 use-case/service 吗?
- ^^ 我之所以这样问是因为我的控制器确实以 HTTP 为中心。例如,其中一些被称为:
PostUser
、GetUser
、DeleteUser
。所以我猜它们应该在 infrastructure
文件夹中,对吧?
我猜只有当您的交付机制是 Web 应用程序时才使用控制器,对吗?
你是对的。与 DDD 没有任何关系,因为 DDD 是关于上下文和语言的,但对于干净的架构、端口和适配器来说,这是正确的想法。
通常情况下,你会有这样的结构:
因此,您的应用程序公开了一个代表端口的 API,您可以连接不同的 edge 组件,这些组件实现不同类型的物理传输协议以与您的申请。
据我所知,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)
// ...
我有几个问题:
- 我什至应该有控制器吗?路由器应该直接将它指向 use-case/service 吗?
- ^^ 我之所以这样问是因为我的控制器确实以 HTTP 为中心。例如,其中一些被称为:
PostUser
、GetUser
、DeleteUser
。所以我猜它们应该在infrastructure
文件夹中,对吧?
我猜只有当您的交付机制是 Web 应用程序时才使用控制器,对吗?
你是对的。与 DDD 没有任何关系,因为 DDD 是关于上下文和语言的,但对于干净的架构、端口和适配器来说,这是正确的想法。
通常情况下,你会有这样的结构:
因此,您的应用程序公开了一个代表端口的 API,您可以连接不同的 edge 组件,这些组件实现不同类型的物理传输协议以与您的申请。