Komennot ja käsittelijät MediatR:llä
Välittäkää pyynnöt omille käsittelijöilleen.
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 idKomennot 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 CreateOrderHandlerMonipuolisten 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:
AddMediatRetsii kokoonpanoista käsittelijät ja rekisteröi ne.- Viestit toteuttavat
IRequest<T>-rajapinnan; käsittelijät toteuttavatIRequestHandler<TRequest, T>-rajapinnan. - Injisoi
ISenderja välitä viesti kutsumallaSend-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.
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
- CQRS:n käsitteet
- Komennot ja käsittelijät MediatR:llä
- Käsittelyputken toiminnat
- Ilmoitukset ja tapahtumat