C# Academy · Oppitunti

Komennot ja käsittelijät MediatR:llä

Välittäkää pyynnöt omille käsittelijöilleen.

Oppitunti 2/413 vaihetta

Komennot ja käsittelijät MediatR:llä on ilmainen C# Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu C# Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. C# Academy-kurssilla on yhteensä 4 oppituntia.

MediatR:n rekisteröinti

MediatR etsii käsittelijät kokoonpanoistasi. Rekisteröi se kerran käynnistyksen yhteydessä ja osoita se kokoonpanoon, joka sisältää käsittelijäsi.

builder.Services.AddMediatR(cfg =>
    cfg.RegisterServicesFromAssembly(typeof(Program).Assembly));

IRequest

Vastauksen odottava viesti toteuttaa IRequest<TResponse>-rajapinnan. Tyyppiparametri määrittää, mitä käsittelijä palauttaa.

public record CreateOrderCommand(int CustomerId, string[] Items)
    : IRequest<int>;   // returns the new order id

Komennot ilman tulosta

Jos komento ei palauta merkityksellistä tulosta, toteuta ei-geneerinen IRequest-rajapinta, joka on lyhenne muodosta IRequest<Unit>.

public record CancelOrderCommand(int OrderId) : IRequest;

IRequestHandler

Käsittelijä toteuttaa IRequestHandler<TRequest, TResponse>-rajapinnan ja tarjoaa Handle-metodin, jossa työ suoritetaan.

public class CreateOrderHandler
    : IRequestHandler<CreateOrderCommand, int>
{
    public Task<int> Handle(
        CreateOrderCommand request, CancellationToken ct)
    {
        // create the order...
        return Task.FromResult(newOrderId);
    }
}

Riippuvuuksien injektointi

Käsittelijät ratkaistaan riippuvuuksien injektion avulla, joten ne voivat vastaanottaa tietokantakontekstin, repositorioita tai muita palveluita konstruktorin kautta.

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

Välittääksesi pyynnön injisoi ISender tai laajempi IMediator ja kutsu Send-metodia. MediatR löytää vastaavan käsittelijän.

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 minimal API -rajapinnoissa

Minimal API -rajapinnoissa ISender injisoidaan suoraan päätepisteen delegaattiin.

app.MapPost("/orders", async (
    CreateOrderCommand cmd, ISender sender) =>
{
    var id = await sender.Send(cmd);
    return Results.Created($"/orders/{id}", new { id });
});

Kyselyt ovat vain pyyntöjä

Kyselyt käyttävät samaa IRequest- ja IRequestHandler-mekanismia. Ainoa ero on tarkoitus: käsittelijä lukee tietoja eikä koskaan muuta niitä.

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);
}

Yksi käsittelijä pyyntöä kohden

Send-kutsua varten pyyntötyyppiä vastaa täsmälleen yksi käsittelijä. Jos samalle pyynnölle on rekisteröity nolla tai kaksi käsittelijää, kyseessä on määritysvirhe.

// CreateOrderCommand -> exactly one CreateOrderHandler

Monipuolisten tulosten palauttaminen

Vastaus voi olla mikä tahansa tyyppi – DTO, tuloskehys tai jopa eri tulosvaihtoehdot erottava tulos – joten käsittelijät voivat ilmaista onnistumisen ja epäonnistumisen selkeästi.

public record Result(bool Ok, string? Error);
public record PlaceOrderCommand(int Id) : IRequest<Result>;

Käsittelijän testaaminen

Käsittelijä on tavallinen luokka, jolla on injisoidut riippuvuudet, joten sen voi testata suoraan ilman HTTP-pyyntöä tai ohjainta.

var handler = new CreateOrderHandler(inMemoryDb);
var id = await handler.Handle(
    new CreateOrderCommand(1, ["sku-1"]), CancellationToken.None);
Assert.True(id > 0);

Pikatarkistus

Varmista, että ymmärrät MediatR:n viestien välitysmallin.

Kertaus

Toteutitte komennot ja käsittelijät:

  • AddMediatR etsii kokoonpanoista käsittelijät ja rekisteröi ne.
  • Viestit toteuttavat IRequest<T>-rajapinnan; käsittelijät toteuttavat IRequestHandler<TRequest, T>-rajapinnan.
  • Injisoi ISender ja välitä viesti kutsumalla Send-metodia; kutakin pyyntöä vastaa täsmälleen yksi käsittelijä.
  • Kyselyt käyttävät samaa mekanismia ja pysyvät vapaina sivuvaikutuksista.

Seuraavaksi käsitellään pipeline-toimintoja.

Aloita maksutta

Opi C# tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
93
Oppitunnit
346

Usein kysytyt kysymykset

Onko oppitunti ”Komennot ja käsittelijät MediatR:llä” ilmainen?

Kyllä – oppitunnin ”Komennot ja käsittelijät MediatR:llä” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko C# Academy-kurssin, päivitä CoddyKit PROhon. C# Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Komennot ja käsittelijät MediatR:llä”?

Välittäkää pyynnöt omille käsittelijöilleen. Harjoittelet C# Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni C# Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin C# Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”Komennot ja käsittelijät MediatR:llä”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä C# Academy-oppitunnilla?

Kyllä. Jokainen C# Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. CQRS:n käsitteet
  2. Komennot ja käsittelijät MediatR:llä
  3. Käsittelyputken toiminnat
  4. Ilmoitukset ja tapahtumat
← Takaisin: C# Academy