C# Academy · Lektion

Kommandon och hanterare med MediatR

Skicka förfrågningar till dedikerade hanterare.

Lektion 2 av 413 steg

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 id

Commands 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 CreateOrderHandler

Returnera 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:

  • AddMediatR söker igenom assemblys för att registrera handlers.
  • Meddelanden implementerar IRequest<T>; handlers implementerar IRequestHandler<TRequest, T>.
  • Injicera ISender och anropa Send fö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.

Gratis att börja

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

  1. CQRS-koncept
  2. Kommandon och hanterare med MediatR
  3. Pipeline-beteenden
  4. Aviseringar och händelser
← Tillbaka till C# Academy