Слой |
Domain (Доменная модель) |
Application (Слой приложений) |
Infrastructure (Инфраструктура) |
Назначение |
Бизнес-правила, которые не принадлежат естественно ни одной сущности |
Координация работы компонентов, реализация входных сценариев |
Технические детали реализации |
Вызов репозиториев |
❌ Никогда |
✅ Да, управляет загрузкой и сохранением |
✅ Да, реализует репозитории |
Работа с несколькими агрегатами |
✅ Да (только бизнес-логика) |
✅ Да (оркестрация + координация) |
❌ Не должны |
Доступ к инфраструктуре |
❌ Никогда |
✅ Через интерфейсы (dependency injection) |
✅ Да, это их основная роль |
Тип данных на вход/выход |
Domain-модели, Value Objects |
DTO / Request/Response-модели |
Технические форматы (JSON, XML, SQL) |
Состояние (State) |
❌ Stateless |
❌ Stateless |
❌ Обычно stateless |
Жизненный цикл объектов |
Работает с уже созданными объектами |
Управляет жизненным циклом доменных объектов |
Обеспечивает persistence |
Управление транзакциями |
❌ Не управляет |
✅ Определяет границы транзакций |
✅ Реализует транзакционность |
Обработка ошибок |
Выбрасывает доменные исключения |
Преобразует доменные исключения в формат внешних слоев |
Обрабатывает технические ошибки |
Ubiquitous Language |
✅ Является частью языка домена |
✅ Использует язык домена |
❌ Использует технические термины |
Пример |
Расчёт скидки по корзине с учетом статуса клиента |
Оформление заказа (проверка наличия, создание, сохранение, отправка уведомлений) |
Email-сервис, HTTP-клиент, Database Repository |
Тестируется как |
Чистая функция с входом/выходом (unit tests) |
Сквозной сценарий (integration tests, может быть с моками) |
Технические тесты (database tests, API tests) |
Зависимости |
Только от других доменных объектов |
От доменных объектов и интерфейсов инфраструктуры |
От внешних систем и библиотек |
Когда использовать |
Когда бизнес-логика не имеет естественного "владельца" среди сущностей |
Для каждого внешнего запроса/команды к системе |
Для всех технических интеграций |