.NET 6.0 — Чистая архитектура с использованием шаблона репозитория и Dapper с протоколированием и модульным тестированием

В этой статье мы узнаем о чистой архитектуре и рассмотрим пример CRUD API в .NET 6.0.

В этом примере мы будем использовать следующие инструменты, технологии и фреймворки:

  • Visual Studio 2022 и .NET 6.0
  • C#
  • MS SQL DB
  • Чистая архитектура
  • Dapper (мини ORM)
  • Паттерн репозитория
  • Единица работы
  • Swagger UI
  • Аутентификация API (на основе ключей)
  • Логирование (с использованием log4net)
  • Модульное тестирование (проект MSTest)

Прежде чем приступить к рассмотрению примера приложения, давайте разберемся, что такое чистая архитектура и каковы ее преимущества.

Целью архитектуры программного обеспечения является минимизация человеческих ресурсов, необходимых для создания и поддержки требуемой системы. — Роберт К. Мартин, Чистая архитектура

Объяснение чистой архитектуры:

Чистая архитектура — это руководство по системной архитектуре, предложенное Робертом К. Мартином, также известным как Дядя Боб. Она является производной от многих архитектурных рекомендаций, таких как гексагональная архитектура, луковичная архитектура и т. д.

  • Основная концепция чистой архитектуры заключается в том, что основная логика приложения изменяется редко, поэтому она будет независимой и считаться основной.
  • Главным правилом, которое заставляет эту архитектуру работать, является правило зависимостей. Это правило гласит, что зависимости в исходном коде могут указывать только внутрь, и ничто во внутреннем круге не может знать ничего о чем-то во внешнем круге.
  • Разделив программное обеспечение на слои и соблюдая правило зависимости, вы создадите внутренне тестируемую систему со всеми вытекающими отсюда преимуществами. Когда какая-либо из внешних частей системы устареет, например, база данных или веб-фреймворк, вы сможете заменить эти устаревшие элементы с минимальной суетой.
  • В чистой архитектуре уровни домена и приложения остаются в центре дизайна, который известен как ядро приложения.
    • Доменный уровень содержит логику предприятия, а прикладной уровень — бизнес-логику.
    • Логика предприятия может использоваться совместно во многих связанных системах, но бизнес-логика не может использоваться совместно, поскольку она предназначена для конкретных потребностей бизнеса.
    • Если у вас нет предприятия, и вы просто пишете одно приложение, то эти сущности являются бизнес-объектами приложения.

Преимущества чистой архитектуры:

  • Независимость от фреймворков — архитектура не зависит от существования некоторой библиотеки программного обеспечения с функциями. Это позволяет использовать такие фреймворки в качестве инструментов.
  • UI Independent — архитектура слабо связана с уровнем пользовательского интерфейса. Таким образом, вы можете менять пользовательский интерфейс, не меняя основной бизнес.
  • Независимость от базы данных — Вы можете поменять SQL Server или Oracle на Mongo, Bigtable, CouchDB или что-то еще. Ваши бизнес-правила не привязаны к базе данных.
  • Высокая ремонтопригодность — соблюдается принцип разделения задач.
  • Высокая тестируемость — приложения, построенные с использованием этого подхода, особенно основная модель домена и ее бизнес-правила, являются чрезвычайно тестируемыми.

Итак, теперь мы получили представление о чистой архитектуре. Перед тем, как приступить к созданию примера API, давайте кратко рассмотрим Dapper.

Объяснение Dapper:

  • Dapper — это простой Object Mapper или Micro-ORM, отвечающий за отображение между базой данных и языком программирования.
  • Dapper был создан командой Stack Overflow для решения своих проблем и с открытым исходным кодом. Использование Dapper в Stack Overflow само по себе демонстрирует его сильные стороны.
  • Он значительно сокращает код доступа к базе данных и фокусируется на выполнении задач, связанных с базой данных, вместо того, чтобы быть полноценным ORM.
  • Он может быть интегрирован с любой базой данных, такой как SQL Server, Oracle, SQLite, MySQL, PostgreSQL и т.д.
  • Если БД уже разработана, то использование Dapper является оптимальным и эффективным вариантом.
  • Производительность: Dapper быстрее выполняет запросы к данным по сравнению с производительностью Entity Framework. Это связано с тем, что Dapper работает непосредственно с RAW SQL и, следовательно, временная задержка относительно меньше.

Наряду с Dapper в этой статье мы будем использовать Repository Pattern и Unit of Work и покажем вам, как Dapper можно использовать в ASP.NET 6.0 API, следуя Repository Pattern и Unit of Work.

Настройка решения и проекта:

Прежде всего, создайте новую таблицу, которая будет использоваться для выполнения операции CRUD. Вы можете использовать скрипты, размещенные в папке CleanArch.Sql/Scripts примера кода.

Когда наш бэк-энд готов, откройте Visual Studio 2022, создайте пустой проект решения и назовите его CleanArch.

Настройте основной слой: Под решением создайте новый проект Class Library и назовите его CleanArch.Core.

— Добавьте новую папку Entities и добавьте новый класс сущности с именем Contact.

Здесь необходимо отметить одну вещь: слой Core не должен зависеть от какого-либо другого проекта или слоя. Это очень важно при работе с чистой архитектурой.

Настройте слой приложений: Добавьте еще один проект библиотеки классов и назовите его CleanArch.Application.

  • Добавьте новую папку Application и в ней определите интерфейсы, которые будут реализованы на другом уровне.
  • Создайте общий интерфейс IRepository и определите методы CRUD.
  • Добавьте ссылку на проект Core, проект Application всегда зависит только от проекта Core.
  • После этого добавьте репозиторий, специфичный для контактов (IContactRepository), и наследуйте его от IRepository.
  • Также создайте новый интерфейс и назовите его IUnitOfWork, поскольку в нашей реализации мы будем использовать Unit of Work.
  • Поскольку мы также реализуем протоколирование, добавьте интерфейс ILogger и добавьте методы для различных уровней протоколирования.

Настройте ведение журнала: Добавьте новый проект библиотеки классов (CleanArch.Logging).

  • Для ведения журнала мы будем использовать библиотеку Log4Net, поэтому установите пакет log4net из менеджера пакетов Nuget.
  • Добавьте ссылку на проект Application, после чего добавьте новый класс Logger и реализуйте интерфейс ILogger.

Настройте проект SQL: Добавьте новый проект библиотеки классов (CleanArch.Sql). Мы будем использовать этот проект для управления запросами Dapper.

  • Добавьте новую папку Queries и добавьте в нее новый класс ContactQueries (для управления dapper-запросами для объекта Contact).
  • Кроме того, добавляется папка Scripts, которая содержит необходимые скрипты таблицы, используемой в примере.

Настройка инфраструктурного уровня: Поскольку наш базовый код готов, теперь добавьте новый проект библиотеки классов и назовите его CleanArch.Infrastructure.

  • Добавьте необходимые пакеты, которые будут использоваться в этом проекте.
Install-Package Dapper
Install-Package Microsoft.Extensions.Configuration
Install-Package Microsoft.Extensions.DependencyInjection.Abstractions
Install-Package System.Data.SqlClient
Войдите в полноэкранный режим Выйдите из полноэкранного режима
  • Добавьте ссылки на проекты (Application, Core, и Sql), и добавьте новую папку Repository.
  • После этого реализуем интерфейс IContactRepository, создав новый класс ContactRepository и внедрив IConfiguration для получения строки подключения из appsettings.json.
  • Также реализуйте интерфейс IUnitOfWork, создав новый класс UnitOfWork.
  • Наконец, зарегистрируйте интерфейсы с реализациями в контейнере служб .NET Core. Добавьте новый класс static ServiceCollectionExtension и добавьте под него метод RegisterServices, внедрив IServiceCollection.
  • Позже мы зарегистрируем его в методе ConfigureService API.

Настройте проект API: Добавьте новый проект .NET 6.0 Web API и назовите его CleanArch.Api.


  • Добавьте ссылки на проекты (Application, Infrastructure, и Logging), и добавьте пакет Swashbuckle.AspNetCore.
  • Создайте файл appsettings.json для управления настройками API и замените строку подключения к БД в разделе ConnectionStrings.
  • Добавьте файл log4net.config и добавьте в него настройки, связанные с логированием. Обязательно установите для свойства Copy to Output Directory значение Copy Always.
  • Настройте параметры запуска, такие как RegisterServices (определенный в проекте CleanArch.Infrastructure), настройте log4net и добавьте Swagger UI (со схемой аутентификации).
  • Удалите классы контроллера/модели по умолчанию и добавьте новый класс в разделе Model (ApiResponse), чтобы управлять общим форматом ответов API.
  • Добавьте новый контроллер и назовите его AuthController, для реализации Not Authorized, так как мы будем использовать аутентификацию на основе ключей.
  • Добавьте AuthorizationFilter, как показано ниже, для управления аутентификацией на основе ключей API.
    • Это позволит проводить аутентификацию на основе главного и вторичных ключей.
    • Мы можем добавить несколько вторичных ключей и включить или выключить их использование в appsettings.
    • Это поможет сохранить наш главный ключ в безопасности и распределить вторичные ключи между различными клиентами по необходимости.
  • Добавьте новый контроллер и назовите его BaseApiController, этот контроллер будет содержать общую реализацию и будет служить базовым контроллером для всех остальных контроллеров API.
  • Наконец, добавьте новый контроллер API, чтобы представить API Contact, внедрив тип объекта IUnitOfWork и добавив все операции CRUD.

Настройте тестовый проект: Добавьте новый тестовый проект MSTest, назовите его CleanArch.Test и добавьте следующие пакеты.

Install-Package Microsoft.Extensions.Configuration
Install-Package MSTest.TestFramework
Install-Package MSTest.TestAdapter
Install-Package Moq
Вход в полноэкранный режим Выйти из полноэкранного режима

  • После этого создайте новый класс ContactControllerShould и настройте все возможные тестовые случаи, просмотрите код проекта CleanArch.Test для дальнейшего понимания.

  • Просмотрите структуру проекта в проводнике решений.

Построение и выполнение тестовых примеров:

  • Постройте решение и запустите покрытие кода, это позволит запустить все тестовые случаи и показать покрытие тестового кода.

Запуск и тестирование API:

Запустите проект и протестируйте все методы CRUD API. (Убедитесь, что CleanArch.Api установлен в качестве стартового проекта).

  • Swagger UI

  • Запуск API без аутентификации приводит к ошибке.

  • Добавьте авторизацию API.

  • POST — Добавить новую запись.

  • GET — Получить все записи.

  • PUT — Обновить существующую запись.

  • GET — Получить одну запись.

  • DELETE — Удалить существующую запись.

ПРИМЕЧАНИЕ:

Ознакомьтесь со всем исходным кодом здесь.

Если у вас есть какие-либо замечания или предложения, пожалуйста, оставьте их в разделе комментариев ниже. Если вы нашли опечатку, предложение, которое можно улучшить, или что-то еще, что следует обновить в этой записи, пожалуйста, перейдите непосредственно в репозиторий блога и откройте новый pull request с вашими изменениями.

Оцените статью
Procodings.ru
Добавить комментарий