# Слои Level 2 > Пояснение нормативной модели слоёв Level 2. Level 2 добавляет `domains` между продуктовой композицией и техническими сервисами приложения. ## Базовая структура ```text src/ ├── app/ ├── compositions/ ├── domains/ ├── infra/ ├── ui/ └── shared/ ``` Отсутствующая роль не требует пустой папки. Проект без самостоятельной доменной ответственности может оставаться на Level 1. ## Роли слоёв | Слой | Роль | |---|---| | `app` | Запуск, маршруты, преобразование входных данных и подключение готовых публичных API | | `compositions` | Страницы, макеты, экраны, виджеты и конкретные продуктовые композиции | | `domains` | Предметные области, их модели, правила, сценарии и продуктовое состояние | | `infra` | Технические сервисы и возможности приложения без самостоятельной предметной модели | | `ui` | Универсальные модули интерфейса без зависимости от конкретной продуктовой композиции | | `shared` | Независимый детерминированный фундамент без знания о продукте, состояния и ввода-вывода | ## Порядок слоёв ```text app ↓ compositions ↓ domains ↓ infra ↓ ui ↓ shared ``` Код слоя может импортировать модули своего или любого нижнего слоя. Промежуточные слои можно пропускать. | Слой | Может импортировать другие слои | |---|---| | `app` | `compositions`, `domains`, `infra`, `ui`, `shared` | | `compositions` | `domains`, `infra`, `ui`, `shared` | | `domains` | `infra`, `ui`, `shared` | | `infra` | `ui`, `shared` | | `ui` | `shared` | | `shared` | Нет | Импорты между модулями одного слоя разрешены. Поэтому один доменный модуль может зависеть от публичного API другого доменного модуля, если общий граф остаётся ацикличным. ## Границы ролей `compositions` определяет устройство конкретной страницы, маршрута или визуального результата. `domains` определяет повторяемую предметную семантику, которая не принадлежит одной композиции. `infra` предоставляет техническую возможность. Если код определяет продуктовую модель, правило или сценарий поверх этой возможности, владельцем такого кода является доменный модуль. Разрешённый импорт не переносит владение. Доменный модуль может использовать `infra` и `ui`, но технический сервис и универсальный интерфейс сохраняют собственных владельцев. ## Связанные правила - [`SLM-L1-LAYER-R001`](../rules/level-1.md#slm-l1-layer-r001) - [`SLM-L1-LAYER-A002`](../rules/level-1.md#slm-l1-layer-a002) - [`SLM-L1-LAYER-R003`](../rules/level-1.md#slm-l1-layer-r003) - [`SLM-L2-DOMAIN-R001`](../rules/level-2.md#slm-l2-domain-r001)