7.4 KiB
Граница доменного пакета
Пояснение контейнерной сущности Level 2 и её совместного использования с доменными модулями Level 1.
Связанные правила
SLM-L2-DOMAIN-R002SLM-L2-DOMAIN-A003SLM-L2-GROUP-R004SLM-L2-BUSINESS-R005SLM-L2-DOMAIN-A026SLM-L2-BUSINESS-A019SLM-L2-ASSEMBLY-A020SLM-L2-ADAPTER-R021
Предметная граница
Доменный пакет представляет одну связную предметную область и объединяет только принадлежащие ей SLM-модули. Пакет auth может содержать business-сценарии авторизации, её browser/server assemblies и React-модули, но не страницу профиля или общий database client.
Пакет не владеет исполняемой ответственностью. Конкретными API, состоянием, зависимостями и lifecycle владеют модули внутри него.
Level 2 применяется к пакету, а не ко всему SLM root. Например, auth может быть пакетом Level 2, пока catalog и news остаются доменными модулями Level 1.
Корень пакета
domains/auth/
├── README.md
├── business/
├── assemblies/
├── adapters/
└── react/
В корне разрешены:
- документация;
- ownership metadata;
- декларативный manifest или декларативная конфигурация архитектурной проверки;
- обязательный модуль
business; - обязательная непустая Group
assemblies; - непустая Group
adapters, если хотя бы одна фабрика имеет технические зависимости; - Framework Groups при наличии соответствующих модулей.
В корне запрещены:
index.tsили другой агрегирующий executable entry point;- runtime-файлы и side effects;
- изменяемое состояние и ресурсы lifecycle;
- реэкспорт API внутренних модулей;
- page-specific компоненты или сборка нескольких доменов.
Metadata содержит только статические данные. Проверяющий инструмент может читать её декларативно, но она не исполняется и не становится скрытым API пакета.
Policy boundary
Доменный пакет не является узлом import-графа. Его техническая граница состоит из объявленного проверке набора дочерних модулей и правил, применяемых ко всем связям через эту границу.
Отсутствие root barrel намеренно:
- client- и server-entry points не агрегируются в один импорт;
- каждый модуль сохраняет отдельную ответственность и environment boundary;
- переименование публичного модуля является изменением его собственного контракта, а не скрывается пакетом;
- versioning целого publishable package остаётся за пределами Level 2.
Модули и Groups
business размещается непосредственно в пакете. Assemblies находятся в обязательной Group assemblies. Production adapters являются самостоятельными модулями Group adapters. Framework Group называется по фреймворку: react, vue и аналогично.
auth/
├── business/ # SLM-модуль
│ ├── index.ts # Только public types
│ ├── factory.ts # Public factories entry
│ └── runtime.ts # Необязательный deterministic runtime
├── adapters/ # Group при наличии technical dependencies
│ └── phone-http/ # SLM-модуль
├── assemblies/ # Обязательная Group
│ └── browser/ # SLM-модуль
└── react/ # Framework Group
├── session/ # SLM-модуль
└── login-form/ # SLM-модуль
Groups не имеют index.ts. Поэтому публичными путями являются auth/business, auth/business/factory, опциональный auth/business/runtime, auth/adapters/phone-http, auth/assemblies/browser и auth/react/session, но не auth, auth/adapters, auth/assemblies или auth/react.
Навигационные Groups
Слой domains может содержать Groups с обеими формами домена:
domains/
└── commerce/ # Навигационная Group
├── catalog/ # Доменный модуль Level 1
└── orders/ # Доменный пакет Level 2
Такая Group отличается от Group внутри пакета допустимым составом: она содержит доменные модули, доменные пакеты и другие navigation Groups, а не внутренние модули пакета.
Одна предметная область не представляется одновременно модулем и пакетом. Переход завершается удалением старой границы именно этого домена, а не переводом всех соседних областей.
Границы соседних слоёв
| Ответственность | Владелец |
|---|---|
| Предметные сценарии, Domain API, доменные ошибки | business |
| Техническая реализация зависимости одного домена | Adapter внутри пакета |
| Сборка API для именованного контекста | Assembly внутри пакета |
| Универсальный технический сервис | infra |
| Domain-specific framework API | Модуль внутри react, vue и аналогичной Group |
| Страница, маршрут, redirect, продуктовый текст | compositions |
| UI, объединяющий несколько доменов | compositions |
Зависимость от React сама по себе не доказывает принадлежность пакету. Решающим остаётся владелец ответственности.