C# Academy · Lekcja

Koncepcje CQRS

Oddzielaj polecenia od zapytań dla większej przejrzystości.

Lekcja 1 z 413 kroki

Koncepcje CQRS to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C# Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C# Academy zawiera 4 lekcji w sumie.

Czym jest CQRS

CQRS to skrót od Command Query Responsibility Segregation, czyli rozdzielenia odpowiedzialności za komendy i zapytania. Idea jest prosta: oddzielić kod, który zmienia stan (komendy), od kodu, który odczytuje stan (zapytania).

// Commands : change state, return little or nothing
// Queries  : return data, change nothing

Komendy

Komenda wyraża zamiar zmiany systemu - utworzenia zamówienia lub anulowania subskrypcji. Jest nazywana w trybie rozkazującym i zwykle zwraca tylko identyfikator albo nic.

public record CreateOrderCommand(int CustomerId, string[] Items);
public record CancelOrderCommand(int OrderId);

Zapytania

Zapytanie służy do pobrania danych bez skutków ubocznych. Nazywa się je zgodnie z tym, co zwraca, i zawiera parametry filtrów.

public record GetOrderByIdQuery(int OrderId);
public record ListOrdersQuery(int CustomerId, int Page);

Dlaczego je rozdzielać

Odczyty i zapisy mają różne potrzeby:

  • Odczyty powinny być szybkie, zdenormalizowane i przyjazne dla cache.
  • Zapisy wymagają walidacji, reguł biznesowych i spójności.

Ich rozdzielenie pozwala każdej stronie rozwijać się i skalować niezależnie.

// Read side  -> optimized projections / DTOs
// Write side -> domain rules / transactions

Wzorzec handlera

Każda komenda lub zapytanie jest przetwarzane przez dedykowanego handlera. Jedna wiadomość, jeden handler, jedna odpowiedzialność - dzięki temu klasy są małe i skoncentrowane.

// CreateOrderCommand  -> CreateOrderHandler
// GetOrderByIdQuery    -> GetOrderByIdHandler

Cienkie kontrolery

W CQRS kontrolery stają się cienkie. Tworzą wiadomość i przekazują ją dalej, a cała logika znajduje się w handlerze. Eliminuje to rozbudowane kontrolery i ułatwia testowanie.

[HttpPost]
public async Task<IActionResult> Create(CreateOrderCommand cmd)
{
    var id = await _sender.Send(cmd);
    return CreatedAtAction(nameof(Get), new { id }, null);
}

CQRS to nie event sourcing

Częste nieporozumienie: CQRS oznacza tylko rozdzielenie odczytu i zapisu. Event sourcing (przechowywanie stanu jako dziennika zdarzeń) to osobny wzorzec, który dobrze współpracuje z CQRS, ale nie jest wymagany.

// You can do CQRS with a plain single database.

Wspólne a rozdzielone magazyny danych

W podstawowym wariancie CQRS obie strony korzystają z jednej bazy danych. Zaawansowane rozwiązania używają osobnych baz odczytu i zapisu, synchronizowanych ze sobą, i akceptują spójność ostateczną na rzecz skalowania. Na początek należy wybrać prostsze rozwiązanie.

// Level 1: one DB, separate handlers (most apps)
// Level 2: separate read/write models
// Level 3: separate read/write databases

Korzyści

CQRS zapewnia:

  • Przejrzyste handlery o jednym zadaniu.
  • Łatwiejsze testowanie - każdy handler można testować w izolacji.
  • Naturalne miejsce na aspekty przekrojowe, takie jak walidacja i logowanie.
  • Niezależne skalowanie odczytów i zapisów.
// One class per use case = easy to find and test

Koszty

CQRS oznacza więcej klas i poziomów pośrednich. W prostej aplikacji CRUD może być przesadą. Należy stosować go tam, gdzie logika biznesowa jest rozbudowana lub domena złożona.

// Trade-off: clarity & scale vs. boilerplate

Wprowadzenie do MediatR

Biblioteka MediatR implementuje działający w obrębie procesu wzorzec mediatora, który przekazuje każdą wiadomość do jej handlera, dzięki czemu nie trzeba łączyć ich ręcznie. W dalszej części kursu będzie używana ta biblioteka.

dotnet add package MediatR

Szybki test

Proszę potwierdzić podstawowe rozróżnienie.

Podsumowanie

Poznali Państwo koncepcje CQRS:

  • Należy oddzielać komendy (zmiany stanu) od zapytań (odczytów).
  • Każda wiadomość ma jednego, wyspecjalizowanego handlera, dzięki czemu kontrolery pozostają cienkie.
  • CQRS jest niezależne od event sourcingu i może korzystać z jednej bazy danych.
  • MediatR przekazuje wiadomości do handlerów.

Następnie: komendy i handlery z MediatR.

Bezpłatny start

Ucz się C# dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
93
Lekcje
346

Często zadawane pytania

Czy lekcja „Koncepcje CQRS” jest bezpłatna?

Tak — pełny tekst „Koncepcje CQRS” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C# Academy, przejdź na CoddyKit PRO. Kurs C# Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Koncepcje CQRS”?

Oddzielaj polecenia od zapytań dla większej przejrzystości. Ćwiczysz C# Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C# Academy?

Nie wymagamy żadnego doświadczenia. C# Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.

Ile czasu zajmuje lekcja „Koncepcje CQRS”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C# Academy?

Tak. Każda lekcja C# Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Koncepcje CQRS
  2. Polecenia i programy obsługi z MediatR
  3. Zachowania potoku
  4. Powiadomienia i zdarzenia
← Powrót do C# Academy