Commando's en handlers met MediatR
Stuur requests door naar gespecialiseerde handlers.
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 idOpdrachten 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 CreateOrderHandlerUitgebreide 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:
AddMediatRdoorzoekt assembly's om handlers te registreren.- Berichten implementeren
IRequest<T>; handlers implementerenIRequestHandler<TRequest, T>. - Injecteer
ISenderen roepSendaan 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.
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
- CQRS-concepten
- Commando's en handlers met MediatR
- Pipelinebehaviors
- Meldingen en gebeurtenissen