C# Academy · Lektion

Commands og handlers med MediatR

Send requests videre til dedikerede handlers.

Lektion 2 af 413 trin

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 id

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

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

  • AddMediatR scanner assemblies for at registrere handlere.
  • Meddelelser implementerer IRequest<T>; handlere implementerer IRequestHandler<TRequest, T>.
  • Indsprøjt ISender, og kald Send for 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.

Gratis at komme i gang

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

  1. CQRS-koncepter
  2. Commands og handlers med MediatR
  3. Pipeline behaviors
  4. Notifikationer og events
← Tilbage til C# Academy