C# Academy · leksjon

Kommandoer og behandlere med MediatR

Send forespørsler til dedikerte behandlere.

Leksjon 2 av 413 trinn

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 id

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

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

  • AddMediatR skanner assemblyer for å registrere handlere.
  • Meldinger implementerer IRequest<T>; handlere implementerer IRequestHandler<TRequest, T>.
  • Injiser ISender og kall Send for å sende meldingen videre; nøyaktig én handler samsvarer.
  • Spørringer bruker den samme mekanismen og forblir uten bivirkninger.

Deretter: pipeline behaviors.

Gratis å komme i gang

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

  1. CQRS-konsepter
  2. Kommandoer og behandlere med MediatR
  3. Pipelinemønstre
  4. Varsler og hendelser
← Tilbake til C# Academy