5.7 KiB
SLM Level 2
Статус: рабочий черновик. Документы в этой папке не являются спецификацией.
Level 2 предназначен для приложений с устойчивыми доменными API, несколькими способами сборки или самостоятельными framework-модулями домена. Он сохраняет слои Level 1, но заменяет простой доменный модуль доменным пакетом с явными владельцами ролей.
Наследование Level 1
Level 2 соблюдает определения и правила Level 1, кроме явно заменённых положений:
| Положение Level 1 | Статус в Level 2 |
|---|---|
Порядок app → compositions → domains → infra → ui → shared |
Сохраняется |
| Модуль, Group, сегмент, компонент, публичный API и граф зависимостей | Сохраняют смысл |
Доменный модуль и SLM-L1-DOMAIN-R015 |
Заменяются доменным пакетом |
Навигационная Group слоя domains |
Может содержать доменные пакеты |
| Group внутри доменного пакета | Содержит обычные SLM-модули и Groups |
Канонический набор требований образуют правила Level 1 и правила Level 2.
Когда выбирать Level 2
Level 2 оправдан, когда предметной области нужны один устойчивый DomainApi, разные сборки для браузера и сервера, несколько технических интеграций или самостоятельные domain-specific модули React, Vue либо другого фреймворка.
Уровень выбирается для всего SLM root. Проект, в котором всем предметным областям достаточно простых доменных модулей, остаётся на Level 1. После завершённого перехода на Level 2 каждая предметная область представлена доменным пакетом, даже если отдельный пакет имеет только business.
Размер каталога сам по себе не требует перехода.
Базовая форма
src/domains/
└── auth/ # Доменный пакет
├── README.md # Необязательная metadata
├── business/ # Обязательный SLM-модуль
│ └── index.ts
├── presets/ # Необязательная Group
│ ├── browser/ # SLM-модуль
│ └── request/ # SLM-модуль
├── adapters/ # Необязательная Group
│ └── identity-provider/ # SLM-модуль
└── react/ # Необязательная framework Group
├── session/ # SLM-модуль
└── login-form/ # SLM-модуль
Корень пакета не является модулем и не имеет index.ts. Каждый исполняемый владелец внутри пакета остаётся обычным SLM-модулем со своим публичным API.
Публичные границы
Приложение получает данные, состояние и результаты домена через готовый экземпляр DomainApi. Технический код импортирует только API конкретного модуля:
import { authFactory, isAuthError } from '@/domains/auth/business'
import { createBrowserAuth } from '@/domains/auth/presets/browser'
import { AuthSessionProvider } from '@/domains/auth/react/session'
import { LoginForm } from '@/domains/auth/react/login-form'
Общие импорты @/domains/auth и @/domains/auth/react запрещены: пакет и Groups не имеют агрегирующих API.
Миграция
Доменные модули Level 1 могут временно сосуществовать с пакетами Level 2 только во время перехода. Такое состояние не является завершённым соответствием Level 2. По SLM-L2-MIGRATION-A017 старые модули и новые пакеты не создают прямых runtime- или type-only зависимостей; связанные части графа мигрируют вместе.