Какие функции выполняют архитектурные слои presentation, integration и application
Что проверяют
Понимаете ли вы, зачем делить приложение на слои и куда направлены зависимости между ними. Следом обычно спрашивают, где у вас живут валидация и транзакции и как вы тестируете слой приложения без базы.
Как отвечать
Назовите роль каждого слоя на примере обычного сервиса на ASP.NET Core:
- presentation: точка входа. Контроллеры или Minimal API, привязка модели, проверка формата входных данных, авторизация через
[Authorize]и политики, превращение результата в HTTP-ответ с нужным кодом. Здесь живут DTO запросов и ответов, но не бизнес-правила; - application: сценарии использования, например «оформить заказ» или «отменить бронь». Сервис или обработчик команды берёт данные, вызывает доменную логику, управляет транзакцией, решает, какие события отправить. Про HTTP и EF Core он ничего не знает;
- integration: всё, что за границей процесса.
DbContextи репозитории на EF Core, типизированные клиенты черезIHttpClientFactory, публикация в брокер, маппинг чужих моделей в свои, повторы и таймауты через Polly илиMicrosoft.Extensions.Http.Resilience.
Главное, что стоит проговорить: зависимости направлены внутрь. Слой приложения объявляет интерфейсы вроде IOrderRepository или IPaymentGateway, а интеграционный слой их реализует и регистрируется в DI. Тогда сценарий тестируется с заглушками, а смена платёжного провайдера не трогает бизнес-логику. Это то же разделение, что в Clean Architecture.
Хорошо добавить, что слои не обязаны быть отдельными проектами: в небольшом сервисе хватит папок, а в большом отдельные сборки не дают случайно добавить лишнюю ссылку.
Где спотыкаются
Кладут бизнес-правила в контроллер. Через год та же логика нужна фоновому обработчику или консюмеру очереди, и её копируют.
Отдают наружу сущности EF Core или IQueryable из репозитория. Presentation начинает сам строить запросы к базе, а если включена ленивая загрузка, сериализация ответа внезапно даёт N+1 запросов.
Путают интеграционный слой с доменом и описывают его как «слой, где лежат данные». Модели и правила предметной области к нему не относятся, он только переводит их в запросы к внешнему миру и обратно.