0Pricing
C# Academy · Lezione

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 nothing

Comandi

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 / transactions

Il 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    -> GetOrderByIdHandler

Controller 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 databases

Vantaggi

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 test

Costi

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. boilerplate

Entra 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 MediatR

Verifica 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.

Tutte le lezioni di questo corso

  1. Concetti di CQRS
  2. Comandi e gestori con MediatR
  3. Comportamenti della pipeline
  4. Notifiche ed eventi
← Torna a C# Academy