MediatR für C# (.NET): Vollständiger Leitfaden mit Beispielen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Was ist MediatR und wozu wird es benötigt?

\n\n

MediatR ist eine leichte, aber leistungsstarke Bibliothek für .NET, die das Mediator-Entwurfsmuster implementiert. In der Softwareentwicklung, insbesondere in Anwendungen, die auf der CQRS-Architektur (Command Query Responsibility Segregation – Trennung von Befehlen und Abfragen) basieren, ist MediatR zum De-facto-Standard geworden.

\n\n

Wozu wird es benötigt?

\n

In einer klassischen Architektur, wenn eine Klasse (z. B. ein Controller) eine Aktion in einer anderen Klasse (z. B. einem Service) ausführen möchte, muss sie von der Existenz dieses Services und seiner Schnittstelle wissen. Dies erzeugt eine starke Kopplung (tight coupling). Wenn Sie vor dem Aufruf des Services eine Protokollierung, Validierung oder Zwischenspeicherung hinzufügen möchten, müssten Sie den Code des Controllers ändern oder Decorators erstellen, was die Wartung erschwert.

\n\n

MediatR löst dieses Problem, indem es das Konzept eines Vermittlers einführt. Die Komponenten des Systems (z. B. Controller) kommunizieren nicht mehr direkt miteinander. Stattdessen senden sie Anfragen (Request) oder Befehle (Command) über MediatR. Die Bibliothek findet und ruft automatisch den entsprechenden Handler auf.

\n\n

Wichtige Vorteile der Verwendung von MediatR:

\n
    \n
  • Lockere Kopplung (Loose Coupling): Der Absender der Anfrage weiß nichts über den Empfänger. Er kennt nur den Typ der Anfrage.
  • \n
  • Prinzip der Einzelverantwortung (SRP): Jeder Handler ist nur für eine einzige Aktion verantwortlich (z. B. "Benutzer erstellen", "Bestellliste abrufen").
  • \n
  • Vereinfachung von CQRS: MediatR eignet sich ideal zur Trennung von Befehlen (die den Zustand ändern) und Abfragen (die den Zustand lesen).
  • \n
  • Verhaltensketten (Pipeline Behaviors): Sie können problemlos übergreifende Funktionalitäten (Protokollierung, Validierung, Transaktionen) hinzufügen, ohne den Code der Handler zu ändern.
  • \n
  • Testbarkeit: Handler lassen sich leicht isoliert testen, und ihre Implementierung kann einfach ausgetauscht werden.
  • \n
\n\n

Installation von MediatR

\n

MediatR wird über NuGet verteilt. Sie können es auf verschiedene Arten installieren:

\n\n

1. Über die .NET CLI (empfohlene Methode)

\n

Öffnen Sie ein Terminal im Stammverzeichnis Ihres Projekts und führen Sie den folgenden Befehl aus:

\n
dotnet add package MediatR
\n

Außerdem benötigen Sie ein Paket für die Abhängigkeitsinjektion (DI), wenn Sie ASP.NET Core verwenden:

\n
dotnet add package MediatR.Extensions.Microsoft.DependencyInjection
\n\n

2. Über die Package Manager Console (Visual Studio)

\n
Install-Package MediatR\nInstall-Package MediatR.Extensions.Microsoft.DependencyInjection
\n\n

3. Über die NuGet Package Manager UI

\n

In Visual Studio: Tools → NuGet Package Manager → Manage NuGet Packages for Solution.... Suchen Sie nach "MediatR" und installieren Sie beide Pakete.

\n\n

Schnellstart mit einem Codebeispiel

\n

Lassen Sie uns ein einfaches Beispiel erstellen: das Senden einer Begrüßung an einen Benutzer.

\n\n

Schritt 1: Erstellen Sie ein Projekt

\n

Erstellen Sie ein neues Konsolenprojekt oder ein ASP.NET Core Web API-Projekt.

\n\n

Schritt 2: Definieren Sie eine Anfrage (Request)

\n

Erstellen Sie eine Klasse, die die Anfrage darstellt. Sie muss das Interface IRequest<TResponse> implementieren, wobei TResponse der Rückgabetyp ist.

\n
using MediatR;\n\npublic class PingRequest : IRequest<string>\n{\n    public string Message { get; set; } = "Ping";\n}
\n\n

Schritt 3: Erstellen Sie einen Handler

\n

Erstellen Sie eine Klasse, die das Interface IRequestHandler<TRequest, TResponse> implementiert.

\n
using MediatR;\nusing System.Threading;\nusing System.Threading.Tasks;\n\npublic class PingHandler : IRequestHandler<PingRequest, string>\n{\n    public Task<string                    

Empfehlungen