3.9 KiB
Домены Level 3
Пояснение строгой внутренней архитектуры Domain.
Level 3 превращает доменный module Level 2 в Domain: немодульную предметную границу с несколькими modules разных технических ролей. Это не новый слой и не обязательный scaffold для каждого проекта.
Связанные правила
Роли внутри Domain
Business определяет поведение и contract.
Ports описывают runtime capabilities business.
Adapters реализуют ports поверх concrete runtime.
Presets собирают API для execution context.
React module адаптирует готовый API к React.
Graph owner удерживает конкретный instance и выполняет lifecycle contract module-владельца.
| Роль | Структурный вид | Когда появляется |
|---|---|---|
business |
Обязательный module | Всегда |
| Preset | Module внутри presets |
Нужна повторяемая assembly |
| Adapter | Private segment preset или module внутри adapters |
Нужна concrete integration |
react |
Framework module непосредственно в Domain | Domain имеет React integration |
Форма Domain
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 являются Groups без собственного runtime/API. errors, lib, ports, services, types, hooks и providers являются segments соответствующих module-владельцев.
Navigation Groups в слое domains допустимы, но не являются Domain и не изменяют его import boundary. Основные примеры Level 3 намеренно показывают Domain непосредственно в domains.
Public API modules
Domain root не имеет index.ts и не реэкспортирует роли. Внешний consumer использует только public entrypoint нужного module:
import { authFactory, type AuthApi } from '@/domains/auth/business'
import { createApplicationAuth } from '@/domains/auth/presets/application'
import { AuthProvider, useAuth } from '@/domains/auth/react'
Private adapter внутри presets/application/adapters не получает external entrypoint. Promoted adapter module получает собственный API для modules Domain; доступ за пределами Domain допускается только как явно объявленная integration extension point.