Находятся ли контроллеры внутри уровня приложения или уровня инфраструктуры? Стоит ли мне вообще использовать контроллеры в чистой архитектуре? - PullRequest
1 голос
/ 16 июня 2020

Насколько я понимаю, 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. Например, некоторые из них называются: PostUser, GetUser, DeleteUser. Итак, я предполагаю, что они должны быть внутри папки infrastructure, верно?

Я предполагаю, что контроллеры используются ТОЛЬКО, если ваш механизм доставки представляет собой веб-приложение, верно?

1 Ответ

3 голосов
/ 16 июня 2020

Вы правы. На самом деле нет ничего общего с DDD, потому что DDD связан с контекстами и языком, но для чистой архитектуры, портов и адаптеров это правильная мысль.

Обычно у вас будет такая структура:

enter image description here

Итак, ваше приложение предоставляет API, который представляет порт, и вы можете подключать различные edge компоненты, реализующие протокол физической доставки различные способы взаимодействия с вашим приложением.

...