Commands und Handler mit MediatR
Leiten Sie Anfragen an dedizierte Handler weiter.
Commands und Handler mit MediatR ist eine kostenlose C# Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C# Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.
MediatR registrieren
MediatR durchsucht Ihre Assemblys, um Handler zu finden. Registrieren Sie es einmal beim Start und verweisen Sie dabei auf eine Assembly, die Ihre Handler enthält.
builder.Services.AddMediatR(cfg =>
cfg.RegisterServicesFromAssembly(typeof(Program).Assembly));IRequest
Eine Nachricht, die eine Antwort erwartet, implementiert IRequest<TResponse>. Der Typparameter gibt an, was der Handler zurückgibt.
public record CreateOrderCommand(int CustomerId, string[] Items)
: IRequest<int>; // returns the new order idBefehle ohne Ergebnis
Wenn ein Befehl nichts Sinnvolles zurückgibt, implementieren Sie das nicht generische IRequest (eine Kurzform für IRequest<Unit>).
public record CancelOrderCommand(int OrderId) : IRequest;IRequestHandler
Der Handler implementiert IRequestHandler<TRequest, TResponse> und stellt die Handle-Methode bereit, in der die Verarbeitung stattfindet.
public class CreateOrderHandler
: IRequestHandler<CreateOrderCommand, int>
{
public Task<int> Handle(
CreateOrderCommand request, CancellationToken ct)
{
// create the order...
return Task.FromResult(newOrderId);
}
}Abhängigkeiten injizieren
Handler werden aus der DI aufgelöst und können daher über den Konstruktor einen Datenbankkontext, Repositories oder andere Dienste entgegennehmen.
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
Um einen Request weiterzuleiten, injizieren Sie ISender (oder den umfassenderen IMediator) und rufen Sie Send auf. MediatR findet den passenden 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 in Minimal APIs
Minimal APIs injizieren ISender direkt in den Endpunkt-Delegaten.
app.MapPost("/orders", async (
CreateOrderCommand cmd, ISender sender) =>
{
var id = await sender.Send(cmd);
return Results.Created($"/orders/{id}", new { id });
});Abfragen sind nur Requests
Abfragen verwenden dieselbe IRequest-/IRequestHandler-Infrastruktur – der einzige Unterschied ist die Absicht: Der Handler liest Daten und verändert sie niemals.
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);
}Ein Handler pro Request
Für Send muss genau ein Handler zu einem Request-Typ passen. Null oder zwei Handler für denselben Request zu registrieren, ist ein Konfigurationsfehler.
// CreateOrderCommand -> exactly one CreateOrderHandlerUmfangreiche Ergebnisse zurückgeben
Eine Antwort kann jeden Typ haben – ein DTO, einen Ergebnis-Wrapper oder sogar eine diskriminierte Ergebnisvariante. So können Handler Erfolg und Fehler ausdrücklich darstellen.
public record Result(bool Ok, string? Error);
public record PlaceOrderCommand(int Id) : IRequest<Result>;Einen Handler testen
Da ein Handler eine einfache Klasse mit injizierten Abhängigkeiten ist, testen Sie ihn direkt – ohne HTTP und ohne Controller.
var handler = new CreateOrderHandler(inMemoryDb);
var id = await handler.Handle(
new CreateOrderCommand(1, ["sku-1"]), CancellationToken.None);
Assert.True(id > 0);Kurztest
Bestätigen Sie das Weiterleitungsmodell von MediatR.
Zusammenfassung
Sie haben Befehle und Handler implementiert:
AddMediatRdurchsucht Assemblys, um Handler zu registrieren.- Nachrichten implementieren
IRequest<T>; Handler implementierenIRequestHandler<TRequest, T>. - Injizieren Sie
ISenderund rufen SieSendauf, um einen Request weiterzuleiten; genau ein Handler passt dazu. - Abfragen verwenden dieselbe Infrastruktur und bleiben frei von Seiteneffekten.
Als Nächstes: Pipeline-Behaviors.
Lerne C# mit einem KI-Tutor — kostenlos
Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.
- Kurse
- 93
- Lektionen
- 346
Häufig gestellte Fragen
Ist die Lektion „Commands und Handler mit MediatR“ kostenlos?
Ja — der vollständige Text von „Commands und Handler mit MediatR“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C# Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Commands und Handler mit MediatR“?
Leiten Sie Anfragen an dedizierte Handler weiter. Du übst C# Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um C# Academy zu starten?
Keine Vorkenntnisse erforderlich. C# Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.
Wie lange dauert die Lektion „Commands und Handler mit MediatR“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser C# Academy-Lektion Code schreiben und ausführen?
Ja. Jede C# Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- CQRS-Konzepte
- Commands und Handler mit MediatR
- Pipeline-Behaviors
- Benachrichtigungen und Events