Слоистая архитектура
Слоистая архитектура — архитектурный подход, при котором система разделяется на логические слои. Каждый отвечает за строго определённую группу задач и взаимодействует с другими слоями по правилам.
Идея: разделить ответственность, чтобы изменения в одной части системы не требовали переписывания всей системы.
Применяется в корпоративных системах, backend-приложениях, монолитах и модульных системах.
Базовые принципы
Разделение ответственности
Каждый слой решает одну категорию задач:
- взаимодействие с пользователем или внешними клиентами,,
- управление бизнес-процессами,
- бизнес-правила,
- работа с данными и внешними системами.
Слой не должен брать на себя задачи, не относящиеся к его ответственности.
Однонаправленные зависимости
Зависимости направлены сверху вниз:
- верхние слои используют нижние,
- нижние не знают о верхних.
Это снижает связанность и упрощает изменение системы.
Контракты между слоями
Контракт слоя — это формальное описание того:
- какие данные слой принимает,
- какие данные возвращает,
- какие ошибки и ограничения возможны.
Контракт важнее реализации.
На практике контракт выражается через:
- интерфейсы (например,
OrderRepository), - DTO и входные команды,
- описанные ошибки и исключения.
Важно:
- верхний слой знает контракт, но не реализацию;
- реализацию можно заменить (другая БД, другой внешний сервис), не меняя выз ывающий слой.
Изоляция изменений
Изменения в одном слое не должны затрагивать другие, если контракт сохранён.
Пример:
- смена базы данных не требует изменений в бизнес-логике;
- смена UI не влияет на доменные правила..
Типовая структура
Презентационный слой (Presentation Layer)
Назначение:
- принять запрос,
- проверить формат данных,
- вернуть результат пользователю или клиенту.
Включает:
Не должно быть:
- бизнес-логики,
- прямой работы с БД.
Слой приложения (Application / Service Layer)
Назначение:
- управлять сценариями использования (use cases),
- определять последовательность шагов,
- управлять транзакциями и безопасностью
Включает:
- сервисы приложений,
- оркестрация логики,
- обработку ошибок сценариев.
Отвечает на вопрос: «что именно нужно сделать», но не содержит бизнес-правил.
Бизнес слой (Domain / Business Layer)
Назначение:
- реализация бизнес-правил и ограничений,
- хранение данных предметной области.
Включает:
- сущности,
- доменные сервисы,
- бизнес-инварианты.
Ключевой слой, ради которого существует система.
Не должно быть:
- логики UI,
- SQL, HTTP-вызовов,
- технических деталей хранения данных.
Инфраструктурный слой (Infrastructure Layer)
Назначение
- реализация технических деталей.
- работа с БД,
- интеграции с внешними системами,
- файловые хранилища, очереди, API, кэш
Включает:
- репозитории,
- ORM,
- HTTP-клиенты,
- адаптеры.
Взаимодействие слоёв
Типовой поток запроса:
- Presentation Layer принимает запрос
- Application Layer запускает сценарий
- Domain Layer выполняет бизнес-логику
- Infrastructure Layer читает или сохраняет данные
- Результат возвращается вверх
Допустимые зависимости
- Presentation → Application.
UI не содержит бизнес-логики, а только инициирует сценарии. Это упрощает изменение интерфейсов.
- Application → Domain.
Слой приложения управляет процессом, бизнес слой — правилами. Логика не дублируется.
- Domain → интерфейсы инфраструктуры.
Бизнес слой знает абстракции, но не реализации. Обеспечивает независимость от технологий.
Недопустимые зависимости
- Presentation → Domain напрямую.
UI начинает управлять бизнес-логикой. При добавлении нового интерфейса логика дублируется.
- Domain → Presentation.
Бизнес-правила становятся зависимыми от UI. Невозможно использовать домен в другом контексте.
- Domain → конкретная БД или HTTP-клиент.
Бизнес слой «привязывается» к технологии. Любая смена БД требует переписывания бизнес-логики.
Другие слои
Могут появляться дополнительные слои:
- Integration Layer — изоляция внешних API и интеграций
- Security Layer — авторизация, аутентификация, ACL
- Caching Layer — работа с кэшем (Redis и аналоги)
- Messaging / Event Layer — очереди, события, асинхронное взаимодействие
Это не обязательные слои. Их выделяют, если появляется отдельная ответственность. Лишние слои усложняют систему.
Пр имер
Банковская система,перевод средств между счетами.
Presentation Layer
- REST API /transfer
- Принимает сумму и счета
- Проверяет формат данных
- Возвращает результат операции
Application Layer
Сценарий TransferMoneyUseCase
- загрузить счета отправителя и получателя,
- проверить права пользователя,
- вызвать доменную операцию перевода,
- сохранить результат.
Domain Layer
- Сущность
Account - Бизнес-правила:
- баланс не может стать отрицательным,
- перевод возможен только между активными счетами,
- комиссия рассчитывается по правилам банка
Infrastructure Layer
- репозиторий счетов (БД),
- интеграция с антифрод-системой,
- публикация события о переводе.
Важно:
- правила перевода находятся только в домене;
- сценарий описан в application-слое;
- БД и интеграции можно заменить без изменения логики перевода.