C# Academy · Lektion

Commands und Handler mit MediatR

Leiten Sie Anfragen an dedizierte Handler weiter.

Lektion 2 von 413 Schritte

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 id

Befehle 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 CreateOrderHandler

Umfangreiche 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:

  • AddMediatR durchsucht Assemblys, um Handler zu registrieren.
  • Nachrichten implementieren IRequest<T>; Handler implementieren IRequestHandler<TRequest, T>.
  • Injizieren Sie ISender und rufen Sie Send auf, um einen Request weiterzuleiten; genau ein Handler passt dazu.
  • Abfragen verwenden dieselbe Infrastruktur und bleiben frei von Seiteneffekten.

Als Nächstes: Pipeline-Behaviors.

Kostenlos starten

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

  1. CQRS-Konzepte
  2. Commands und Handler mit MediatR
  3. Pipeline-Behaviors
  4. Benachrichtigungen und Events
← Zurück zu C# Academy