Koncepcje CQRS
Oddzielaj polecenia od zapytań dla większej przejrzystości.
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 nothingKomendy
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 / transactionsWzorzec 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 -> GetOrderByIdHandlerCienkie 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 databasesKorzyś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 testKoszty
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. boilerplateWprowadzenie 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 MediatRSzybki 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.
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.