Files
slm-design/DRAFT/level-3/domains/README.md

82 lines
4.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Домены Level 3
> Пояснение строгой внутренней архитектуры домена.
Level 3 заменяет доменный модуль Level 2 немодульной предметной границей — доменом. Внутри неё размещаются модули с разными техническими ролями. Это не новый слой и не обязательный каркас для каждого проекта.
## Связанные правила
- [`SLM-L3-DOMAIN-R001`](../../rules/level-3.md#slm-l3-domain-r001)
- [`SLM-L3-DOMAIN-A002`](../../rules/level-3.md#slm-l3-domain-a002)
- [`SLM-L3-BUSINESS-R003`](../../rules/level-3.md#slm-l3-business-r003)
- [`SLM-L1-MODULE-A004`](../../rules/level-1.md#slm-l1-module-a004)
## Роли внутри домена
```text
Модуль бизнес-логики определяет поведение и публичный контракт.
Порты описывают возможности, которые нужны бизнес-логике.
Адаптеры реализуют порты в конкретной среде.
Типовые сборки повторяемо создают API.
Модуль React связывает готовый API с React.
Владелец графа удерживает экземпляр API и завершает его жизненный цикл.
```
| Роль | Структурный вид | Когда появляется |
|---|---|---|
| Бизнес-логика | Обязательный модуль `business` | Всегда |
| Типовая сборка | Модуль внутри `presets` | Нужен повторяемый способ сборки |
| Адаптер | Закрытый сегмент сборки или модуль внутри `adapters` | Нужна техническая интеграция |
| Связь с React | Модуль `react` непосредственно в домене | Домен предоставляет API для React |
## Форма домена
```text
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` и не реэкспортирует дочерние модули. Внешний потребитель использует публичную точку входа нужного модуля:
```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. Доступ к нему за пределами домена допускается только как явно объявленная точка расширения интеграции.
## Карта раздела
- [Граница домена](./domain.md)
- [Модуль бизнес-логики](./business.md)
- [Фабрика, порты и адаптеры](./factory-ports-adapters.md)
- [Типовые сборки и SSR](./presets.md)
- [Модуль React](./framework-bindings.md)
- [Тестирование](./testing.md)
- [Пример переноса домена](./auth-example.md)
- [Открытые вопросы](./open-questions.md)