Какие слои (layers) лучше всего выделить при проектировании приложения?

«Какие слои (layers) лучше всего выделить при проектировании приложения?» — вопрос из категории Архитектура, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Классическая многослойная архитектура (Layered или N-Tier) разделяет ответственность, упрощает поддержку и тестирование. Вот основные рекомендуемые слои:

  1. Presentation Layer (Слой представления). Отвечает за взаимодействие с пользователем или внешними системами.

    • Примеры: ASP.NET Core Controllers, MVC Views, Razor Pages, Web API Controllers, gRPC Services, Blazor Components.
    • Задача: Принимать запросы, валидировать входные данные, вызывать бизнес-логику и возвращать ответы.
  2. Application Layer (Слой приложения/Use Cases). Оркестрирует выполнение конкретных сценариев использования (use cases).

    • Примеры: Сервисы приложения (Application Services), MediatR Handlers, Command/Query объекты (CQRS).
    • Задача: Координировать работу доменного слоя и инфраструктуры для выполнения бизнес-транзакции. Не содержит сложной бизнес-логики.
      // Application Service (координатор)
      public class PlaceOrderService
      {
      private readonly IOrderRepository _repo;
      private readonly IPaymentGateway _gateway;
      public async Task Execute(PlaceOrderCommand command)
      {
          var order = new Order(command.Items); // Домен
          await _repo.Save(order);              // Инфраструктура
          await _gateway.Charge(order.Total);   // Инфраструктура
      }
      }
  3. Domain Layer (Доменный слой). Ядро приложения, содержащее бизнес-логику, правила и сущности.

    • Примеры: Сущности (Entities), Объекты-значения (Value Objects), Агрегаты (Aggregates), Доменные сервисы (Domain Services), Доменные события (Domain Events).
    • Задача: Инкапсулировать ключевые бизнес-правила. Этот слой не должен зависеть от других слоев.
  4. Infrastructure Layer (Инфраструктурный слой). Реализует технические детали доступа к внешним ресурсам.

    • Примеры: Репозитории (Repositories), доступ к БД (DbContext), вызов внешних API, отправка email, работа с файловой системой, кэширование.
    • Задача: Предоставлять абстракции (интерфейсы), которые определены в слоях выше (Application/Domain).

Ключевой принцип: Зависимости направлены внутрь, к доменному слою. Presentation → Application → Domain ← Infrastructure. Это обеспечивает тестируемость и независимость бизнес-логики от деталей реализации.