Kommandoer og behandlere med MediatR
Send forespørsler til dedikerte behandlere.
Kommandoer og behandlere med MediatR er en gratis leksjon i C# Academy på CoddyKit. Dette er leksjon 2 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i C# Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i C# Academy inneholder totalt 4 leksjoner.
Registrere MediatR
MediatR skanner assemblyene Deres for å finne handlere. Registrer det én gang ved oppstart, og angi en assembly som inneholder handlerne.
builder.Services.AddMediatR(cfg =>
cfg.RegisterServicesFromAssembly(typeof(Program).Assembly));IRequest
En melding som forventer et svar, implementerer IRequest<TResponse>. Typeparameteren angir hva handleren returnerer.
public record CreateOrderCommand(int CustomerId, string[] Items)
: IRequest<int>; // returns the new order idKommandoer uten resultat
Hvis en kommando ikke returnerer noe meningsfullt, implementerer den den ikke-generiske IRequest (som er en forkortelse for IRequest<Unit>).
public record CancelOrderCommand(int OrderId) : IRequest;IRequestHandler
Handleren implementerer IRequestHandler<TRequest, TResponse> og tilbyr metoden Handle, der arbeidet utføres.
public class CreateOrderHandler
: IRequestHandler<CreateOrderCommand, int>
{
public Task<int> Handle(
CreateOrderCommand request, CancellationToken ct)
{
// create the order...
return Task.FromResult(newOrderId);
}
}Injisere avhengigheter
Handlere hentes fra DI, slik at de kan motta en databasekontekst, repositorier eller andre tjenester gjennom konstruktøren.
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
For å sende en forespørsel injiserer De ISender (eller den mer omfattende IMediator) og kaller Send. MediatR finner den samsvarende handleren.
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);
}
}Sende i minimale API-er
Minimale API-er injiserer ISender direkte i endepunktdelegaten.
app.MapPost("/orders", async (
CreateOrderCommand cmd, ISender sender) =>
{
var id = await sender.Send(cmd);
return Results.Created($"/orders/{id}", new { id });
});Spørringer er bare forespørsler
Spørringer bruker den samme IRequest- og IRequestHandler-mekanismen – den eneste forskjellen er hensikten: Handleren leser og endrer aldri data.
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);
}Én handler per forespørsel
For Send må nøyaktig én handler samsvare med en forespørselstype. Det er en konfigurasjonsfeil å registrere null eller to handlere for samme forespørsel.
// CreateOrderCommand -> exactly one CreateOrderHandlerReturnere innholdsrike resultater
Et svar kan være av hvilken som helst type – en DTO, en resultatwrapper eller til og med et diskriminert utfall – slik at handlere kan uttrykke suksess og feil eksplisitt.
public record Result(bool Ok, string? Error);
public record PlaceOrderCommand(int Id) : IRequest<Result>;Teste en handler
Fordi en handler er en vanlig klasse med injiserte avhengigheter, tester De den direkte – uten HTTP og uten behov for en kontroller.
var handler = new CreateOrderHandler(inMemoryDb);
var id = await handler.Handle(
new CreateOrderCommand(1, ["sku-1"]), CancellationToken.None);
Assert.True(id > 0);Rask kontroll
Bekreft MediatR-modellen for sending.
Oppsummering
De har implementert kommandoer og handlere:
AddMediatRskanner assemblyer for å registrere handlere.- Meldinger implementerer
IRequest<T>; handlere implementererIRequestHandler<TRequest, T>. - Injiser
ISenderog kallSendfor å sende meldingen videre; nøyaktig én handler samsvarer. - Spørringer bruker den samme mekanismen og forblir uten bivirkninger.
Deretter: pipeline behaviors.
Lær deg C# med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 93
- Leksjoner
- 346
Ofte stilte spørsmål
Er leksjonen «Kommandoer og behandlere med MediatR» gratis?
Ja – hele teksten i «Kommandoer og behandlere med MediatR» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av C# Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i C# Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Kommandoer og behandlere med MediatR»?
Send forespørsler til dedikerte behandlere. Du øver på C# Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med C# Academy?
Ingen tidligere erfaring er nødvendig. C# Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.
Hvor lang tid tar leksjonen «Kommandoer og behandlere med MediatR»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne C# Academy-leksjonen?
Ja. Alle C# Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- CQRS-konsepter
- Kommandoer og behandlere med MediatR
- Pipelinemønstre
- Varsler og hendelser