Concetti di CQRS
Separi i comandi dalle query per maggiore chiarezza.
Concetti di CQRS è una lezione C# Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C# Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C# Academy include 4 lezioni in totale.
Che cos'è CQRS?
CQRS è l'acronimo di Command Query Responsibility Segregation. L'idea è semplice: separare il codice che modifica lo stato (i comandi) dal codice che legge lo stato (le query).
// Commands : change state, return little or nothing
// Queries : return data, change nothingComandi
Un comando esprime l'intenzione di modificare il sistema: creare un ordine o annullare un abbonamento. Ha un nome imperativo e in genere restituisce solo un ID o nulla.
public record CreateOrderCommand(int CustomerId, string[] Items);
public record CancelOrderCommand(int OrderId);Query
Una query richiede dati senza effetti collaterali. Il suo nome indica ciò che restituisce e contiene gli eventuali parametri di filtro.
public record GetOrderByIdQuery(int OrderId);
public record ListOrdersQuery(int CustomerId, int Page);Perché separarli?
Letture e scritture hanno esigenze diverse:
- Le letture devono essere veloci, denormalizzate e adatte al caching.
- Le scritture richiedono convalida, regole di business e coerenza.
Separarle consente a ciascun lato di evolversi e scalare in modo indipendente.
// Read side -> optimized projections / DTOs
// Write side -> domain rules / transactionsIl pattern degli handler
Ogni comando o query viene elaborato da un handler dedicato. Un messaggio, un handler, una responsabilità: questo mantiene le classi piccole e focalizzate.
// CreateOrderCommand -> CreateOrderHandler
// GetOrderByIdQuery -> GetOrderByIdHandlerController sottili
Con CQRS, i controller diventano sottili. Costruiscono un messaggio e lo inviano; tutta la logica risiede nell'handler. Questo elimina i controller troppo ricchi e migliora la testabilità.
[HttpPost]
public async Task<IActionResult> Create(CreateOrderCommand cmd)
{
var id = await _sender.Send(cmd);
return CreatedAtAction(nameof(Get), new { id }, null);
}CQRS non è event sourcing
Un errore comune consiste nel confonderli: CQRS riguarda solo la separazione tra lettura e scrittura. L'event sourcing (memorizzazione dello stato come registro di eventi) è un pattern separato che si abbina bene a CQRS, ma non è obbligatorio.
// You can do CQRS with a plain single database.Un unico archivio dati o archivi separati
Il CQRS di base utilizza un unico database per entrambi i lati. Le configurazioni avanzate usano archivi separati per lettura e scrittura, mantenuti sincronizzati, accettando la coerenza eventuale in cambio della scalabilità. Inizi con una soluzione semplice.
// Level 1: one DB, separate handlers (most apps)
// Level 2: separate read/write models
// Level 3: separate read/write databasesVantaggi
CQRS offre:
- Handler chiari e con un unico scopo.
- Test più semplici: ogni handler viene testato in isolamento.
- Un punto naturale per le funzionalità trasversali (convalida, logging).
- Scalabilità indipendente di letture e scritture.
// One class per use case = easy to find and testCosti
CQRS aggiunge più classi e livelli di indirezione. Per una semplice app CRUD può essere eccessivo. Lo applichi quando la logica di business è ricca o il dominio è complesso.
// Trade-off: clarity & scale vs. boilerplateEntra in scena MediatR
La libreria MediatR implementa il pattern mediator in-process, che invia ogni messaggio al relativo handler, senza doverli collegare manualmente. Il resto del corso utilizza questa libreria.
dotnet add package MediatRVerifica rapida
Verifichi la distinzione fondamentale.
Riepilogo
Ha appreso i concetti di CQRS:
- Separi i comandi (modifiche dello stato) dalle query (letture).
- Ogni messaggio ha un unico handler focalizzato, mantenendo sottili i controller.
- CQRS è indipendente dall'event sourcing e può utilizzare un unico database.
- MediatR invia i messaggi agli handler.
Prossimo argomento: comandi e handler con MediatR.
Domande Frequenti
La lezione «Concetti di CQRS» è gratuita?
Sì — il testo completo di «Concetti di CQRS» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C# Academy, passa a CoddyKit PRO. Il corso C# Academy include 4 lezioni in totale.
Cosa imparerò in «Concetti di CQRS»?
Separi i comandi dalle query per maggiore chiarezza. Eserciti C# Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare C# Academy?
Non è richiesta alcuna esperienza precedente. C# Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.
Quanto tempo richiede la lezione «Concetti di CQRS»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione C# Academy?
Sì. Ogni lezione C# Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.