Files
slm-design/DRAFT/level-3/domains

Домены 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. Доступ к нему за пределами домена допускается только как явно объявленная точка расширения интеграции.

Карта раздела