Commands og handlers med MediatR
Send requests videre til dedikerede handlers.
Commands og handlers med MediatR er en gratis C# Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i C# Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C# Academy-kurset indeholder 4 lektioner i alt.
Registrering af MediatR
MediatR scanner dine assemblies for at finde handlere. Registrér det én gang ved opstart, og peg det på en assembly, der indeholder dine handlere.
builder.Services.AddMediatR(cfg =>
cfg.RegisterServicesFromAssembly(typeof(Program).Assembly));IRequest
En meddelelse, der forventer et svar, implementerer IRequest<TResponse>. Typeparameteren angiver, hvad handleren returnerer.
public record CreateOrderCommand(int CustomerId, string[] Items)
: IRequest<int>; // returns the new order idKommandoer uden resultat
Hvis en kommando ikke returnerer noget meningsfuldt, skal du implementere den ikke-generiske IRequest (som er en forkortelse for IRequest<Unit>).
public record CancelOrderCommand(int OrderId) : IRequest;IRequestHandler
Handleren implementerer IRequestHandler<TRequest, TResponse> og leverer Handle-metoden, hvor arbejdet udføres.
public class CreateOrderHandler
: IRequestHandler<CreateOrderCommand, int>
{
public Task<int> Handle(
CreateOrderCommand request, CancellationToken ct)
{
// create the order...
return Task.FromResult(newOrderId);
}
}Indsprøjtning af afhængigheder
Handlere hentes fra DI, så de kan modtage en databasekontekst, repositories eller andre tjenester gennem 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 at sende en anmodning videre skal du indsprøjte ISender (eller den bredere IMediator) og kalde Send. MediatR finder den matchende 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 i minimale API'er
Minimale API'er indsprøjter ISender direkte i endpoint-delegaten.
app.MapPost("/orders", async (
CreateOrderCommand cmd, ISender sender) =>
{
var id = await sender.Send(cmd);
return Results.Created($"/orders/{id}", new { id });
});Forespørgsler er bare anmodninger
Forespørgsler bruger den samme mekanisme med IRequest / IRequestHandler – den eneste forskel er hensigten: Handleren læser og ændrer aldrig 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 pr. anmodning
Ved Send skal præcis én handler passe til en anmodningstype. Hvis der registreres nul eller to handlere til den samme anmodning, er det en konfigurationsfejl.
// CreateOrderCommand -> exactly one CreateOrderHandlerReturnering af omfattende resultater
Et svar kan være af enhver type – en DTO, en resultatindpakning eller endda et udfald med adskilte varianter – så handlere kan udtrykke succes og fejl eksplicit.
public record Result(bool Ok, string? Error);
public record PlaceOrderCommand(int Id) : IRequest<Result>;Afprøvning af en handler
Fordi en handler er en almindelig klasse med indsprøjtede afhængigheder, afprøver du den direkte – ingen HTTP eller controller er nødvendig.
var handler = new CreateOrderHandler(inMemoryDb);
var id = await handler.Handle(
new CreateOrderCommand(1, ["sku-1"]), CancellationToken.None);
Assert.True(id > 0);Hurtigt tjek
Bekræft MediatR's model for videresendelse.
Opsummering
Du har implementeret kommandoer og handlere:
AddMediatRscanner assemblies for at registrere handlere.- Meddelelser implementerer
IRequest<T>; handlere implementererIRequestHandler<TRequest, T>. - Indsprøjt
ISender, og kaldSendfor at sende videre; præcis én handler matcher. - Forespørgsler genbruger den samme mekanisme og forbliver uden bivirkninger.
Næste emne: adfærd i behandlingskæden.
Lær C# med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 93
- Lektioner
- 346
Ofte stillede spørgsmål
Er lektionen “Commands og handlers med MediatR” gratis?
Ja — hele teksten til “Commands og handlers med MediatR” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af C# Academy-kurset, skal du opgradere til CoddyKit PRO. C# Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Commands og handlers med MediatR”?
Send requests videre til dedikerede handlers. Du øver dig i C# Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på C# Academy?
Der kræves ingen tidligere erfaring. C# Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.
Hvor lang tid tager lektionen “Commands og handlers med MediatR”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne C# Academy-lektion?
Ja. Alle C# Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- CQRS-koncepter
- Commands og handlers med MediatR
- Pipeline behaviors
- Notifikationer og events