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 idKomendy 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 CreateOrderHandlerZwracanie 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:
AddMediatRskanuje zestawy, aby zarejestrować handlery.- Wiadomości implementują
IRequest<T>, a handlery implementująIRequestHandler<TRequest, T>. - Należy wstrzyknąć
ISenderi 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
- Koncepcje CQRS
- Polecenia i programy obsługi z MediatR
- Zachowania potoku
- Powiadomienia i zdarzenia