Comandi e gestori con MediatR
Inoltri le richieste a gestori dedicati.
Comandi e gestori con MediatR è una lezione C# Academy gratuita su CoddyKit. Questa è la lezione 2 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.
Registrazione di MediatR
MediatR analizza gli assembly per individuare gli handler. Lo registri una volta all'avvio, indicandogli un assembly che contiene gli handler.
builder.Services.AddMediatR(cfg =>
cfg.RegisterServicesFromAssembly(typeof(Program).Assembly));IRequest
Un messaggio che prevede una risposta implementa IRequest<TResponse>. Il parametro di tipo indica ciò che l'handler restituisce.
public record CreateOrderCommand(int CustomerId, string[] Items)
: IRequest<int>; // returns the new order idComandi senza risultato
Se un comando non restituisce nulla di significativo, implementi l'interfaccia non generica IRequest (abbreviazione di IRequest<Unit>).
public record CancelOrderCommand(int OrderId) : IRequest;IRequestHandler
L'handler implementa IRequestHandler<TRequest, TResponse> e fornisce il metodo Handle, in cui viene eseguito il lavoro.
public class CreateOrderHandler
: IRequestHandler<CreateOrderCommand, int>
{
public Task<int> Handle(
CreateOrderCommand request, CancellationToken ct)
{
// create the order...
return Task.FromResult(newOrderId);
}
}Iniezione delle dipendenze
Gli handler vengono risolti tramite DI, quindi possono ricevere nel costruttore un contesto del database, repository o altri servizi.
public class CreateOrderHandler(AppDbContext db)
: IRequestHandler<CreateOrderCommand, int>
{
public async Task<int> Handle(
CreateOrderCommand request, CancellationToken ct)
{
var order = new Order { CustomerId = request.CustomerId };
db.Orders.Add(order);
await db.SaveChangesAsync(ct);
return order.Id;
}
}ISender
Per inviare una richiesta, inietti ISender (oppure il più ampio IMediator) e chiami Send. MediatR individua l'handler corrispondente.
public class OrdersController(ISender sender) : ControllerBase
{
[HttpPost]
public async Task<IActionResult> Create(CreateOrderCommand cmd)
{
int id = await sender.Send(cmd);
return CreatedAtAction(nameof(Get), new { id }, null);
}
}Send nelle minimal API
Le minimal API iniettano direttamente ISender nel delegato dell'endpoint.
app.MapPost("/orders", async (
CreateOrderCommand cmd, ISender sender) =>
{
var id = await sender.Send(cmd);
return Results.Created($"/orders/{id}", new { id });
});Le query sono semplicemente richieste
Le query utilizzano gli stessi meccanismi di IRequest / IRequestHandler: l'unica differenza è l'intento, perché l'handler legge i dati senza mai modificarli.
public record GetOrderQuery(int Id) : IRequest<OrderDto?>;
public class GetOrderHandler(AppDbContext db)
: IRequestHandler<GetOrderQuery, OrderDto?>
{
public async Task<OrderDto?> Handle(
GetOrderQuery q, CancellationToken ct) =>
await db.Orders
.Where(o => o.Id == q.Id)
.Select(o => new OrderDto(o.Id, o.Total))
.SingleOrDefaultAsync(ct);
}Un handler per ogni richiesta
Per Send deve corrispondere a un tipo di richiesta esattamente un handler. La registrazione di zero o due handler per la stessa richiesta è un errore di configurazione.
// CreateOrderCommand -> exactly one CreateOrderHandlerRestituzione di risultati articolati
Una risposta può essere di qualsiasi tipo: un DTO, un wrapper del risultato o persino un esito discriminato, consentendo agli handler di esprimere esplicitamente successo e fallimento.
public record Result(bool Ok, string? Error);
public record PlaceOrderCommand(int Id) : IRequest<Result>;Test di un handler
Poiché un handler è una normale classe con dipendenze iniettate, lo si testa direttamente: non servono HTTP né un controller.
var handler = new CreateOrderHandler(inMemoryDb);
var id = await handler.Handle(
new CreateOrderCommand(1, ["sku-1"]), CancellationToken.None);
Assert.True(id > 0);Verifica rapida
Verifichi il modello di invio di MediatR.
Riepilogo
Ha implementato comandi e handler:
AddMediatRanalizza gli assembly per registrare gli handler.- I messaggi implementano
IRequest<T>; gli handler implementanoIRequestHandler<TRequest, T>. - Inietti
ISendere chiamiSendper inviare il messaggio; corrisponde esattamente un handler. - Le query riutilizzano gli stessi meccanismi e non producono effetti collaterali.
Prossimo argomento: comportamenti della pipeline.
Domande Frequenti
La lezione «Comandi e gestori con MediatR» è gratuita?
Sì — il testo completo di «Comandi e gestori con MediatR» è 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 «Comandi e gestori con MediatR»?
Inoltri le richieste a gestori dedicati. 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 2 di 4.
Quanto tempo richiede la lezione «Comandi e gestori con MediatR»?
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
- Concetti di CQRS
- Comandi e gestori con MediatR
- Comportamenti della pipeline
- Notifiche ed eventi