【问题标题】:Are controllers inside the application layer or infrastructure layer? Should I even use controllers in Clean Architecture?控制器是在应用层还是基础设施层?我什至应该在 Clean Architecture 中使用控制器吗?
【发布时间】:2020-06-16 07:11:35
【问题描述】:

据我所知,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. 我应该有控制器吗?路由器是否应该直接将其定向到用例/服务?
  2. ^^ 我之所以这样问是因为我的控制器确实以 HTTP 为中心。例如其中一些被称为:PostUserGetUserDeleteUser。所以我猜它们应该在infrastructure 文件夹中,对吧?

我猜只有当你的交付机制是一个网络应用程序时才会使用控制器,对吧?

【问题讨论】:

    标签: node.js express domain-driven-design clean-architecture


    【解决方案1】:

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

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

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

    【讨论】:

    • 太棒了,非常感谢您的澄清。所以控制器只是适配器,端口就是用例,对吗?那么控制器像我在上面所做的那样明确接收 HTTP 请求没有问题吗?谢谢
    • 而且,控制器也是演示者,对吧?因为他们发送请求并返回它
    • 演示者直接使用视图。控制器只返回模型。但是,它不在这个问题的范围内。
    猜你喜欢
    • 2010-10-22
    • 2017-06-10
    • 1970-01-01
    • 2013-01-15
    • 2020-10-12
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    相关资源
    最近更新 更多