Ответ
Классическая многослойная архитектура (Layered или N-Tier) разделяет ответственность, упрощает поддержку и тестирование. Вот основные рекомендуемые слои:
-
Presentation Layer (Слой представления). Отвечает за взаимодействие с пользователем или внешними системами.
- Примеры: ASP.NET Core Controllers, MVC Views, Razor Pages, Web API Controllers, gRPC Services, Blazor Components.
- Задача: Принимать запросы, валидировать входные данные, вызывать бизнес-логику и возвращать ответы.
-
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); // Инфраструктура } }
-
Domain Layer (Доменный слой). Ядро приложения, содержащее бизнес-логику, правила и сущности.
- Примеры: Сущности (Entities), Объекты-значения (Value Objects), Агрегаты (Aggregates), Доменные сервисы (Domain Services), Доменные события (Domain Events).
- Задача: Инкапсулировать ключевые бизнес-правила. Этот слой не должен зависеть от других слоев.
-
Infrastructure Layer (Инфраструктурный слой). Реализует технические детали доступа к внешним ресурсам.
- Примеры: Репозитории (Repositories), доступ к БД (DbContext), вызов внешних API, отправка email, работа с файловой системой, кэширование.
- Задача: Предоставлять абстракции (интерфейсы), которые определены в слоях выше (Application/Domain).
Ключевой принцип: Зависимости направлены внутрь, к доменному слою. Presentation → Application → Domain ← Infrastructure. Это обеспечивает тестируемость и независимость бизнес-логики от деталей реализации.