0Pricing
C# Academy · Lekcja

Polecenia i programy obsługi z MediatR

Przekazuj żądania do wyspecjalizowanych programów obsługi.

Polecenia i programy obsługi z MediatR to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C# Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C# Academy zawiera 4 lekcji w sumie.

Rejestrowanie MediatR

MediatR skanuje zestawy, aby wykryć handlery. Należy zarejestrować go raz podczas uruchamiania aplikacji, wskazując zestaw zawierający handlery.

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

IRequest

Wiadomość oczekująca odpowiedzi implementuje IRequest<TResponse>. Parametr typu określa wartość zwracaną przez handler.

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

Komendy bez wyniku

Jeśli komenda nie zwraca żadnej istotnej wartości, należy zaimplementować niegeneryczny interfejs IRequest (będący skrótem dla IRequest<Unit>).

public record CancelOrderCommand(int OrderId) : IRequest;

IRequestHandler

Handler implementuje IRequestHandler<TRequest, TResponse> i udostępnia metodę Handle, w której wykonywana jest właściwa praca.

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

Wstrzykiwanie zależności

Handlery są pobierane z DI, więc mogą przyjmować w konstruktorze kontekst bazy danych, repozytoria lub inne usługi.

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

Aby wysłać request, wstrzyknij ISender (lub szerszy interfejs IMediator) i wywołaj Send. MediatR znajdzie pasujący 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 w Minimal APIs

W Minimal APIs można bezpośrednio wstrzyknąć ISender do delegata endpointu.

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

Zapytania to również requesty

Zapytania korzystają z tego samego mechanizmu IRequest / IRequestHandler - różnią się tylko intencją: handler odczytuje dane i nigdy ich nie modyfikuje.

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

Jeden handler na request

W przypadku Send dokładnie jeden handler musi pasować do typu requestu. Zarejestrowanie zera lub dwóch handlerów dla tego samego requestu jest błędem konfiguracji.

// CreateOrderCommand -> exactly one CreateOrderHandler

Zwracanie rozbudowanych wyników

Odpowiedź może mieć dowolny typ - DTO, opakowanie wyniku, a nawet wynik z rozróżnieniem wariantów - dzięki czemu handlery mogą jawnie wyrażać powodzenie i niepowodzenie.

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

Testowanie handlera

Ponieważ handler jest zwykłą klasą z wstrzykniętymi zależnościami, można testować go bezpośrednio - bez HTTP i bez kontrolera.

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

Szybki test

Proszę potwierdzić sposób przekazywania requestów przez MediatR.

Podsumowanie

Zaimplementowali Państwo komendy i handlery:

  • AddMediatR skanuje zestawy, aby zarejestrować handlery.
  • Wiadomości implementują IRequest<T>, a handlery implementują IRequestHandler<TRequest, T>.
  • Należy wstrzyknąć ISender i wywołać Send, aby przekazać request; pasuje do niego dokładnie jeden handler.
  • Zapytania korzystają z tego samego mechanizmu i nie powodują skutków ubocznych.

Następnie: zachowania pipeline'u.

Często zadawane pytania

Czy lekcja „Polecenia i programy obsługi z MediatR” jest bezpłatna?

Tak — pełny tekst „Polecenia i programy obsługi z MediatR” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C# Academy, przejdź na CoddyKit PRO. Kurs C# Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Polecenia i programy obsługi z MediatR”?

Przekazuj żądania do wyspecjalizowanych programów obsługi. Ćwiczysz C# Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C# Academy?

Nie wymagamy żadnego doświadczenia. C# Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Polecenia i programy obsługi z MediatR”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C# Academy?

Tak. Każda lekcja C# Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Koncepcje CQRS
  2. Polecenia i programy obsługi z MediatR
  3. Zachowania potoku
  4. Powiadomienia i zdarzenia
← Powrót do C# Academy