Введение в разделение ответственности командных запросов (CQRS) -iFour


Что такое API?

Прежде чем узнать, что такое CQRS, сначала мы узнаем об API. Простыми словами API — это интерфейс, представляющий собой набор функций и методов, которые позволяют программистам получить доступ к определенным функциям и данным приложения.

Особенности Asp.Net Web API

  • Он поддерживает различные функции MVC, такие как контроллеры, маршрутизация, связующие модели, результаты действий, фильтр, контейнер IOC или внедрение зависимостей, что делает его более простым и легким в разработке.
  • Мы можем создать ASP.NET web API, который форматируется с помощью MediaTypeFormatter Web API в XML или JSON или любой другой формат, который вы хотите добавить в качестве MediaTypeFormatter.
  • Он поддерживает основанные на конвенции действия создания, обновления и удаления, откуда он работает с HTTP-главами, такими как GET, POST, PUT и DELETE.
  • Мы можем создавать WebAPI различными способами, которые принимают и генерируют контент, который не является объектно-ориентированным, как изображения или любые другие файлы документов.
  • ASP.NET Web API дает ответы в коде состояния HTTP.
  • Он может быть размещен в приложении или на IIS.

Что такое CQRS?

CQRS расшифровывается как «Command Query Responsibility Segregation». CQRS — это паттерн, описанный Грегом Янгом. Его основной частью является представление о том, что для обновления информации можно использовать другую модель, чем та, которую вы используете для чтения информации. Для некоторых ситуаций такое разделение часто оказывается ценным, но следует помнить, что для многих систем CQRS добавляет рискованную сложность.

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

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

Читать далее: Понимание помощников тегов валидации в Asp.net Core

Преимущества CQRS

Независимое масштабирование

CQRS позволяет рабочим нагрузкам чтения и записи масштабироваться независимо друг от друга, что должно привести к уменьшению количества блокировок.

Безопасность

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

Разделение проблем

Дифференциация сторон чтения и записи может привести к созданию более удобных и гибких моделей. Вся сложная бизнес-логика попадает в модель записи, и модель чтения легко сравнить с моделью записи.

Более простые запросы

Храня материализованное представление в базе данных для чтения, приложение может избежать сложных объединений при запросах.

Давайте начнем использовать CQRS с помощью программы

Чтобы последовать моему примеру, сначала вам нужно клонировать мой проект из моего репозитория GitHub.

После завершения клонирования из моего репозитория откройте решение CQRSDemo.sln.

После клонирования кода моего проекта давайте разберемся в структуре решения
Решение представляет собой шаблон ASP.NET core с некоторыми папками, включенными вручную. В решении есть две папки, включенные вручную Commands и Queries.

В папке command вы найдете классы, реализующие командную часть шаблона, а в папке queries — классы, связанные с запросами.

Контроллеры

В контроллере вы найдете класс PostController, в котором есть два метода, первый — Get () и второй — SavePost(). Вы можете видеть, что метод Save реализован как команда, а второй метод Get реализован как запрос.

Код класса контроллера приведен ниже.


  [ApiController]
    public class PostsController :ControllerBase
    {
        private readonlyIQueriesService _queries;
        private readonlyICommandService _commands;
        public PostsController(IQueriesService queries, ICommandService commands)
       {
            _queries = queries ?? throw new ArgumentNullException(nameof(queries));
            _commands = commands ?? throw new ArgumentNullException(nameof(commands));
        }
       // GET api/values
        [HttpGet]
        public asyncTask<actionresult> Get()
        {
            return (await _queries.GetAllPostId()).ToList();
        }
        // POST api/values
        [HttpPost]
        public void SavePost([FromBody] SavePostDto value)
        {
            _commands.SavePost(value.Title, value.Body);
        }
    }</actionresult>

Вход в полноэкранный режим Выход из полноэкранного режима

Как вы видите, мы строим с помощью конструктора службу запросов и службу команд в этом контроллере. Изначально мы настраиваем фреймворк ASP.NET core dependency injection framework для обработки всех связанных с этим ситуаций.

В этом контроллере метод Get вызывает службу запросов, а метод savepost вызывает службу команд. Как мы знаем, запрос — это операция только для чтения, а команда — это действие, которое изменяет состояние системы.

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

Папка команд

Она содержит интерфейс, который определяет, какие команды сервис способен выполнять в базовой реализации.

Ниже представлен интерфейс ICommandService:


public interface ICommandService
    {
        Task SavePost(string title, string body);
    }
public class CommandService :ICommandService
    {
        private readonlyBlogContext _context;
        public CommandService(BlogContext context)
        {
_context=context??throw new ArgumentNullException(nameof(context));
        }
        public async Task SavePost(string title, string body)
        {
            var post = new Post() { Title = title, Body = body };
            await _context.Posts.AddAsync(post );
            await _context.SaveChangesAsync();
            return post ;
        }
    }

Войти в полноэкранный режим Выйти из полноэкранного режима

Реализация этого интерфейса основана на Entity Framework Core, который хранит данные внутри экземпляра SQL Service.

Хотите поговорить с нашим высококвалифицированным разработчиком .NET Core? Свяжитесь сейчас.

Запросы

В папке Command вы можете увидеть IQueriesService, который описывает службу запросов.


public interface IQueriesService
  {
  Task GetAllPostId();
  }

Вход в полноэкранный режим Выход из полноэкранного режима

Интерфейс IQueriesService содержит метод Task GetAllPostId(); для получения уникальных идентификаторов в базе данных.


public class QueriesService :IQueriesService
{
  private readonly string _connectionString;
    public QueriesService(string connectionString)
    {
      if (string.IsNullOrEmpty(connectionString))
    {
    throw new ArgumentException("message", nameof(connectionString));
    }
      _connectionString = connectionString;
    }
    public async Task GetAllPostId()
    {
      using (var conn = new SqlConnection(_connectionString))
    {
    conn.Open();
    return await conn.QueryAsync("SELECT Id FROM dbo.Posts;");
    }
  }
}

Вход в полноэкранный режим Выход из полноэкранного режима

Как вы видели, запрос и команда отличаются друг от друга и отделены друг от друга, а для чтения — только для чтения мы используем каркас сущности.

Одним из лучших преимуществ CQRS является то, что мы можем построить высоко оптимизированную операцию чтения и дифференцировать операции для различных хранилищ данных.

Заключение

Мы надеемся, что с помощью этой статьи вы полностью поймете паттерн CQRS и как реализовать его в API и разрешить его CQRS — это паттерн. Мы занимаемся программированием команд и запросов в различных моделях, которые используются для простоты реализации и более оптимизированной структуры.

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