C# Academy · Les

Commando's en handlers met MediatR

Stuur requests door naar gespecialiseerde handlers.

Les 2 van 413 stappen

Commando's en handlers met MediatR is een gratis C# Academy-les op CoddyKit. Dit is les 2 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject C# Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus C# Academy bevat in totaal 4 lessen.

MediatR registreren

MediatR doorzoekt je assembly's om handlers te vinden. Registreer het één keer bij het opstarten en wijs het naar een assembly die je handlers bevat.

builder.Services.AddMediatR(cfg =>
    cfg.RegisterServicesFromAssembly(typeof(Program).Assembly));

IRequest

Een bericht dat een antwoord verwacht, implementeert IRequest<TResponse>. De typeparameter bepaalt wat de handler teruggeeft.

public record CreateOrderCommand(int CustomerId, string[] Items)
    : IRequest<int>;   // returns the new order id

Opdrachten zonder resultaat

Als een opdracht niets betekenisvols teruggeeft, implementeer je de niet-generieke IRequest (een afkorting voor IRequest<Unit>).

public record CancelOrderCommand(int OrderId) : IRequest;

IRequestHandler

De handler implementeert IRequestHandler<TRequest, TResponse> en biedt de Handle-methode waarin het werk gebeurt.

public class CreateOrderHandler
    : IRequestHandler<CreateOrderCommand, int>
{
    public Task<int> Handle(
        CreateOrderCommand request, CancellationToken ct)
    {
        // create the order...
        return Task.FromResult(newOrderId);
    }
}

Afhankelijkheden injecteren

Handlers worden vanuit DI opgehaald, zodat ze via de constructor een databasecontext, repository's of andere services kunnen ontvangen.

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

Injecteer voor het doorsturen van een aanvraag ISender (of het bredere IMediator) en roep Send aan. MediatR vindt de bijbehorende handler.

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 in minimale API's

Minimale API's injecteren ISender rechtstreeks in de endpointdelegate.

app.MapPost("/orders", async (
    CreateOrderCommand cmd, ISender sender) =>
{
    var id = await sender.Send(cmd);
    return Results.Created($"/orders/{id}", new { id });
});

Query's zijn gewoon aanvragen

Query's gebruiken hetzelfde mechanisme met IRequest / IRequestHandler - het enige verschil is de intentie: de handler leest en wijzigt nooit iets.

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);
}

Eén handler per aanvraag

Voor Send moet precies één handler overeenkomen met een aanvraagt ype. Nul of twee handlers registreren voor hetzelfde bericht is een configuratiefout.

// CreateOrderCommand -> exactly one CreateOrderHandler

Uitgebreide resultaten teruggeven

Een antwoord kan elk type zijn - een DTO, een resultaatomhulsel of zelfs een uitkomst met onderscheiden varianten - zodat handlers succes en fouten expliciet kunnen uitdrukken.

public record Result(bool Ok, string? Error);
public record PlaceOrderCommand(int Id) : IRequest<Result>;

Een handler testen

Omdat een handler een gewone klasse met geïnjecteerde afhankelijkheden is, test je deze rechtstreeks - zonder HTTP en zonder controller.

var handler = new CreateOrderHandler(inMemoryDb);
var id = await handler.Handle(
    new CreateOrderCommand(1, ["sku-1"]), CancellationToken.None);
Assert.True(id > 0);

Korte controle

Controleer hoe het doorstuurmodel van MediatR werkt.

Samenvatting

Je hebt opdrachten en handlers geïmplementeerd:

  • AddMediatR doorzoekt assembly's om handlers te registreren.
  • Berichten implementeren IRequest<T>; handlers implementeren IRequestHandler<TRequest, T>.
  • Injecteer ISender en roep Send aan om een bericht door te sturen; precies één handler komt overeen.
  • Query's gebruiken hetzelfde mechanisme en blijven vrij van neveneffecten.

Volgende onderwerp: gedrag in de pijplijn.

Gratis beginnen

Leer C# met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
93
Lessen
346

Veelgestelde vragen

Is de les “Commando's en handlers met MediatR” gratis?

Ja — de volledige tekst van “Commando's en handlers met MediatR” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus C# Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus C# Academy bevat in totaal 4 lessen.

Wat leer ik in “Commando's en handlers met MediatR”?

Stuur requests door naar gespecialiseerde handlers. Je oefent met C# Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met C# Academy te beginnen?

Ervaring vooraf is niet nodig. C# Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.

Hoe lang duurt de les “Commando's en handlers met MediatR”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over C# Academy?

Ja. Elke les over C# Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. CQRS-concepten
  2. Commando's en handlers met MediatR
  3. Pipelinebehaviors
  4. Meldingen en gebeurtenissen
← Terug naar C# Academy