CQRS - это...

Просто о NET | created: 11/5/2020 | published: 11/5/2020 | updated: 2/28/2021 | view count: 149 | comments: 0

Несколько фактов о CQRS

Что такое CQRS?

Для начала давайте определимся, что же всё-таки такое CQRS. Итак, CQRS - это способ написания программного кода. Аббревиатура расшифровывается как Command and Query Responsibility Segregation (CQRS). То есть это разделение ответственности на команды и запросы. Единственное, для чего он был придуман, так это для того, чтобы разделить операции записи в базу данных от операций чтения данных. И всё потому, что операции записи требуют больше ресурсов и времени чем операции чтения. Всё! И чего только не услышишь про этот CQRS, и "Task Based UIs", и даже "Event Sourcing"... Просто жесть! Давайте покажу на примере.

Пример применения паттерна CQRS на C#

Предположим, что у меня есть интерфейс репозитория для работы с сущностью User:

/// <summary>
/// User repository
/// </summary>
public interface IUserRepository{

	/// <summary>
	/// Returns user by identifer
	/// </summary>
	User GetById(Guid id);

	/// <summary>
	/// Returns user by identifer
	/// </summary>
	IPagedList<User> GetPaged(int pageIndex, int pageSize);

	/// <summary>
	/// Creates new user
	/// </summary>
	void CreateUser(string firstName, string lastName, DateTime dateOfBirth);

	/// <summary>
	/// Updates new user
	/// </summary>
	void UpdateUser(Guid id, string firstName, string lastName, DateTime dateOfBirth);

	/// <summary>
	/// Deletes user by identifier
	/// </summary>
	void DeleteUser(Guid id);

	/// <summary>
	/// Sets Salary for user with identity
	/// </summary>
	void SetSalary(Guid id, decimal value);
}

Обратите внимание, что в моём репозитории есть несколько методов на получение данные (другими словами Query) и несколько методов на запись (можно назвать Command).

После того как я применю паттерн (подход), который уже набил оскомину и назавается CQRS, то мой репозиторий разделится на две части. Первая - это набор запросов (Queries):

/// <summary>
/// User repository for read data
/// </summary>
public interface IUserReadRepository
{
	/// <summary>
	/// Returns user by identifer
	/// </summary>
	User GetById(Guid id);

	/// <summary>
	/// Returns user by identifer
	/// </summary>
	IPagedList<User> GetPaged(int pageIndex, int pageSize);
}

и вторая часть - это набор комманд (Commands):

/// <summary>
/// User repository for write
/// </summary>
public interface IUserWriteRepository
{
	/// <summary>
	/// Creates new user
	/// </summary>
	void CreateUser(string firstName, string lastName, DateTime dateOfBirth);

	/// <summary>
	/// Updates new user
	/// </summary>
	void UpdateUser(Guid id, string firstName, string lastName, DateTime dateOfBirth);

	/// <summary>
	/// Deletes user by identifier
	/// </summary>
	void DeleteUser(Guid id);

	/// <summary>
	/// Sets Salary for user with identity
	/// </summary>
	void SetSalary(Guid id, decimal value);
}

Всё. Больше ничего в этом CQRS нет.

Заключение

В качестве заключения позвольте привести список "НЕ..."

  1. CQRS НЕ потребует на изучение более 2 минут.
  2. CQRS - это НЕ панацея от всех проблем
  3. CQRS НЕ является Event Sourcing
  4. CQRS НЕ трубует Message Queue (шины сообщений)
  5. CQRS внутренне НЕ связан с DDD
  6. CQRS НЕ является архитектурой верхнего уровня
  7. CQRS НЕ является основолагающим принципом
  8. CQRS - это НЕ новый подход.
  9. CQRS - это НЕ серебрянная пуля, и он никак не улучшит ваш код
  10. CQRS НЕ сделает ваш прижок в высоту выше

Ссылки

Comments (2)

11/5/2020 2:23:24 PM [CQRS - это...] : Андрей

В начале статьи когда описывали IUserRepository допущена грубая ошибка: надо было сразу сказать, что этот интерфейс УЖЕ написан по шаблону CQRS. Вон, даже по первой же ссылке написано что? "Принцип гласит, что метод должен быть либо командой, выполняющей какое-то действие, либо запросом, возвращающим данные, но не одновременно". Посмотрите на каждый метод и найдите в нём хоть один метод, объединяющий и действие и получение данных. Ответственности УЖЕ разделены. Точка.

11/5/2020 2:33:17 PM [CQRS - это...] : Calabonga

Тут тоже?

 Я всего лишь перевёл статью потому что согласен с автором. 😄

А еще с этим автором согласен 😀

  1. By submitting a comment and providing the site with personal data, you agree To The Privacy Policy that is set on the site.
  2. All comments are moderated for the presence of idiomatic expressions and obscene words. The link tags will be removed addressFrom the message text.