0Pricing
C# Academy · Lezione

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 id

Comandi 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 CreateOrderHandler

Restituzione 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:

  • AddMediatR analizza gli assembly per registrare gli handler.
  • I messaggi implementano IRequest<T>; gli handler implementano IRequestHandler<TRequest, T>.
  • Inietti ISender e chiami Send per 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

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