Альтернативная организация NestJS-проекта: разделение API и бизнес-слоя

от автора

в ,
Время чтения: 1 мин.

NestJS изначально предлагает организовывать приложение вокруг модулей. Обычно структура строится по функциональным областям:

src/
├── users/
│   ├── users.module.ts
│   ├── users.controller.ts
│   ├── users.service.ts
│   └── dto/
│
├── orders/
│   ├── orders.module.ts
│   ├── orders.controller.ts
│   └── orders.service.ts
│
└── app.module.ts

Такой подход удобен тем, что всё, что относится к одной функциональности, находится в одном месте.

Но существует и другой вариант организации проекта — разделить приложение по архитектурным слоям.

Например:

src/
├── api/             # транспортный слой
├── services/        # бизнес-логика и прикладные модули
├── repositories/    # доступ к данным
├── entities/        # модели
├── integrations/    # внешние сервисы
├── auth/
├── common/
├── app.module.ts
└── main.ts

В такой структуре верхний уровень проекта сразу показывает основные части системы.

api отвечает за взаимодействие с внешним миром:

  • контроллеры;
  • маршруты;
  • DTO;
  • обработку входящих данных.

services содержит основные модули приложения:

  • бизнес-логику;
  • сценарии работы;
  • взаимодействие между компонентами.

repositories и integrations выделяются как отдельные слои для работы с данными и внешними системами.

Главное отличие такого подхода в том, что граница проходит не по функциональности, а по роли компонента в приложении.

Поток становится более явным:

Request
  |
  v
API
  |
  v
Service
  |
  +--> Repository
  |
  +--> Integration

Преимущество такой организации — в общей читаемости проекта. Открывая структуру, сразу видно, где находится транспортный слой, где бизнес-логика, а где инфраструктурные компоненты.

Такой вариант может быть удобен для проектов, где есть несколько способов взаимодействия с приложением или где хочется явно отделить внешний интерфейс от внутренней реализации.

Это не замена стандартной модульной организации NestJS, а другой способ группировки кода — выбор зависит от размера проекта и архитектурных предпочтений команды.


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Сколько будет 5 + 8?