Домены Level 3
Пояснение строгой внутренней архитектуры домена.
Level 3 заменяет доменный модуль Level 2 немодульной предметной границей — доменом. Внутри неё размещаются модули с разными техническими ролями. Это не новый слой и не обязательный каркас для каждого проекта.
Связанные правила
Роли внутри домена
Модуль бизнес-логики определяет поведение и публичный контракт.
Порты описывают возможности, которые нужны бизнес-логике.
Адаптеры реализуют порты в конкретной среде.
Типовые сборки повторяемо создают API.
Модуль React связывает готовый API с React.
Владелец графа удерживает экземпляр API и завершает его жизненный цикл.
| Роль | Структурный вид | Когда появляется |
|---|---|---|
| Бизнес-логика | Обязательный модуль business |
Всегда |
| Типовая сборка | Модуль внутри presets |
Нужен повторяемый способ сборки |
| Адаптер | Закрытый сегмент сборки или модуль внутри adapters |
Нужна техническая интеграция |
| Связь с React | Модуль react непосредственно в домене |
Домен предоставляет API для React |
Форма домена
domains/auth/
├── business/
│ ├── errors/
│ ├── lib/
│ ├── ports/
│ ├── services/
│ ├── types/
│ └── index.ts
├── presets/
│ └── application/
│ ├── adapters/
│ └── index.ts
├── adapters/
│ └── identity-provider/
│ └── index.ts
└── react/
├── hooks/
├── providers/
└── index.ts
Модуль business обязателен; остальные ветки появляются по необходимости. presets и adapters являются группами без собственного исполняемого кода и API. Каталоги errors, lib, ports, services, types, hooks и providers являются сегментами соответствующих модулей-владельцев.
Навигационные группы в слое domains допустимы, но не являются доменами и не меняют их публичные границы. Основные примеры Level 3 показывают домены непосредственно в domains.
Публичные API модулей
Корень домена не имеет index.ts и не реэкспортирует дочерние модули. Внешний потребитель использует публичную точку входа нужного модуля:
import { authFactory, type AuthApi } from '@/domains/auth/business'
import { createApplicationAuth } from '@/domains/auth/presets/application'
import { AuthProvider, useAuth } from '@/domains/auth/react'
Закрытый адаптер внутри presets/application/adapters не получает внешней точки входа. Адаптер, оформленный самостоятельным модулем, предоставляет минимальный публичный API. Доступ к нему за пределами домена допускается только как явно объявленная точка расширения интеграции.