Kommandon och hanterare med MediatR
Skicka förfrågningar till dedikerade hanterare.
Kommandon och hanterare med MediatR är en gratis lektion i C# Academy på CoddyKit. Detta är lektion 2 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för C# Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i C# Academy innehåller totalt 4 lektioner.
Registrera MediatR
MediatR söker igenom era assemblys för att hitta handlers. Registrera det en gång vid uppstart och peka på en assembly som innehåller era handlers.
builder.Services.AddMediatR(cfg =>
cfg.RegisterServicesFromAssembly(typeof(Program).Assembly));IRequest
Ett meddelande som förväntar sig ett svar implementerar IRequest<TResponse>. Typparametern anger vad handlern returnerar.
public record CreateOrderCommand(int CustomerId, string[] Items)
: IRequest<int>; // returns the new order idCommands utan resultat
Om ett command inte returnerar något meningsfullt implementerar ni det icke-generiska IRequest (vilket är en kortform för IRequest<Unit>).
public record CancelOrderCommand(int OrderId) : IRequest;IRequestHandler
Handlern implementerar IRequestHandler<TRequest, TResponse> och tillhandahåller metoden Handle där arbetet utförs.
public class CreateOrderHandler
: IRequestHandler<CreateOrderCommand, int>
{
public Task<int> Handle(
CreateOrderCommand request, CancellationToken ct)
{
// create the order...
return Task.FromResult(newOrderId);
}
}Injicera beroenden
Handlers hämtas från DI, så de kan ta emot en databaskontext, repositories eller andra tjänster via konstruktorn.
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
För att skicka ett request injicerar ni ISender (eller det bredare IMediator) och anropar Send. MediatR hittar den matchande handlern.
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 minimal APIs
Minimal APIs injicerar ISender direkt i endpoint-delegaten.
app.MapPost("/orders", async (
CreateOrderCommand cmd, ISender sender) =>
{
var id = await sender.Send(cmd);
return Results.Created($"/orders/{id}", new { id });
});Queries är bara requests
Queries använder samma mekanism med IRequest / IRequestHandler – den enda skillnaden är avsikten: handlern läser och ändrar 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);
}En handler per request
För Send måste exakt en handler matcha en request-typ. Att registrera noll eller två handlers för samma request är ett konfigurationsfel.
// CreateOrderCommand -> exactly one CreateOrderHandlerReturnera innehållsrika resultat
Ett svar kan ha vilken typ som helst – en DTO, en result wrapper eller till och med ett resultat med olika utfall – så att handlers kan uttrycka lyckade och misslyckade resultat tydligt.
public record Result(bool Ok, string? Error);
public record PlaceOrderCommand(int Id) : IRequest<Result>;Testa en handler
Eftersom en handler är en vanlig klass med injicerade beroenden testar ni den direkt – utan HTTP och utan controller.
var handler = new CreateOrderHandler(inMemoryDb);
var id = await handler.Handle(
new CreateOrderCommand(1, ["sku-1"]), CancellationToken.None);
Assert.True(id > 0);Snabbkontroll
Bekräfta hur MediatR:s dispatch-modell fungerar.
Sammanfattning
Ni har implementerat commands och handlers:
AddMediatRsöker igenom assemblys för att registrera handlers.- Meddelanden implementerar
IRequest<T>; handlers implementerarIRequestHandler<TRequest, T>. - Injicera
ISenderoch anropaSendför att skicka meddelanden; exakt en handler matchar. - Queries använder samma mekanism och förblir fria från sidoeffekter.
Nästa steg: pipeline behaviors.
Lär dig C# med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 93
- Lektioner
- 346
Vanliga frågor
Är lektionen ”Kommandon och hanterare med MediatR” gratis?
Ja – hela texten till ”Kommandon och hanterare med MediatR” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i C# Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i C# Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Kommandon och hanterare med MediatR”?
Skicka förfrågningar till dedikerade hanterare. Ni övar på C# Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig C# Academy?
Du behöver inga förkunskaper. Utbildningen i C# Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.
Hur lång tid tar lektionen ”Kommandon och hanterare med MediatR”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här C# Academy-lektionen?
Ja. Varje C# Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- CQRS-koncept
- Kommandon och hanterare med MediatR
- Pipeline-beteenden
- Aviseringar och händelser