Published on

Как применять Clean Architecture в ASP.NET CORE

Authors
  • avatar
    Name
    Николай Маракасов
    Twitter
    @Twitter

Введение

Clean Architecture предлагает структурировать приложение по двум измерениям:

  1. Разделение по пользовательским сценариям на основе принципа единой ответственности.
  2. Разделение на основе правил зависимостей.

В этой статье мы рассмотрим практический пример реализации этого подхода.

Реализация

Начнём с классической диаграммы, которую видят все, кто гуглит эту тему: clean-arch

Каждый слой на диаграмме можно реализовать как отдельный проект в ASP.NET приложении.

Entities

Это ядро приложения, которое хранит бизнес-правила, инкапсулированные через сущности, агрегаты, доменные события и доменные сервисы. Я размещаю интерфейсы репозиториев на этом уровне рядом с агрегатами или сущностями. Поскольку здесь хранятся не только сущности, я называю проект Domain. Также встречаются названия: Core или ApplicationCore. Этот уровень не зависит от других и содержит только чистые бизнес-правила и абстракции.

Use Cases

Этот уровень я называю Application. Он зависит только от уровня Domain и реализует бизнес-сценарии, следуя принципу единой ответственности. Задачи уровня:

  • Принимать DTO от уровня API.
  • Использовать интерфейсы репозиториев для получения доменных сущностей.
  • Выполнять необходимые операции и возвращать результат в виде DTO.

Infrastructure

Этот уровень отвечает за:

  • Доступ к данным.
  • Вызовы внешних сервисов.
  • Коммуникации с брокерами сообщений и т. д.

Я разделяю проект на папки по функциональной области. Например:

  • DataAccess: содержит DbContext, имплементации репозиториев и запросов, маппинги типов для EntityFramework, а также директорию с миграциями.

Если приложение становится большим, этот уровень можно разделить на отдельные проекты.

Web, UI, API

Это входная точка для клиентов приложения. На этом уровне определяем:

  • Наборы доступных API-методов.
  • Настройки DI (Dependency Injection).
  • Аутентификацию и авторизацию.
  • Конфигурацию, логирование и другие аспекты, связанные с фреймворком.

Финальная структура проекта

project

Заключение

Clean Architecture можно реализовать по-разному:

  • В рамках одной сборки через папки.
  • Отдельными проектами.
  • Объединяя несколько уровней в один.

Главное — придерживаться правил зависимостей и опираться на пользовательские сценарии. В следующих статьях я подробно рассмотрю уровень Application и его взаимодействие с Domain.