mirror of
https://github.com/gromlab-ru/slm-design.git
synced 2026-08-22 07:30:16 +03:00
82 lines
4.7 KiB
Markdown
82 lines
4.7 KiB
Markdown
# Домены 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)
|