Pipeline-Behaviors
Fügen Sie mit Behaviors querschnittliche Logik hinzu.
Pipeline-Behaviors ist eine kostenlose C# Academy-Lektion auf CoddyKit. Dies ist Lektion 3 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.
Übergreifende Belange
Protokollierung, Validierung, Zeitmessung und Transaktionen gelten für viele Handler. Diesen Code in jeden Handler zu kopieren, ist repetitiv und fehleranfällig.
Die Pipeline-Behaviors von MediatR ermöglichen es Ihnen, jeden Request mit gemeinsamer Logik zu umschließen.
// One behavior runs around all handlersIPipelineBehavior
Ein Behavior implementiert IPipelineBehavior<TRequest, TResponse>. Seine Handle-Methode erhält den Request und einen next-Delegaten, der den restlichen Teil der Pipeline aufruft.
public class LoggingBehavior<TRequest, TResponse>
: IPipelineBehavior<TRequest, TResponse>
where TRequest : notnull
{
public async Task<TResponse> Handle(
TRequest request,
RequestHandlerDelegate<TResponse> next,
CancellationToken ct)
{
// before
var response = await next();
// after
return response;
}
}Der nächste Delegat
next() ruft das nächste Behavior oder, falls es das letzte ist, den eigentlichen Handler auf. Code vor dem Aufruf wird auf dem Hinweg ausgeführt; Code danach auf dem Rückweg.
// [Behavior A in] -> [Behavior B in] -> [Handler]
// <- [Behavior B out] <- [A out]Ein Logging-Behavior
Ein konkretes Logging-Behavior protokolliert auf dem Hinweg den Namen des Requests und auf dem Rückweg die verstrichene Zeit.
public async Task<TResponse> Handle(
TRequest request,
RequestHandlerDelegate<TResponse> next,
CancellationToken ct)
{
var name = typeof(TRequest).Name;
_logger.LogInformation("Handling {Name}", name);
var sw = Stopwatch.StartNew();
var response = await next();
_logger.LogInformation("{Name} took {Ms}ms", name, sw.ElapsedMilliseconds);
return response;
}Ein Behavior registrieren
Registrieren Sie das offene generische Behavior in der DI. MediatR wendet es auf jeden Request an.
builder.Services.AddTransient(
typeof(IPipelineBehavior<,>),
typeof(LoggingBehavior<,>));Ein Validierungs-Behavior
Eine häufige Anwendung ist die Request-Validierung mit FluentValidation. Das Behavior führt alle Validatoren aus, bevor der Handler ausgeführt wird, und löst eine Ausnahme aus, wenn einer davon fehlschlägt.
public async Task<TResponse> Handle(
TRequest request,
RequestHandlerDelegate<TResponse> next,
CancellationToken ct)
{
var context = new ValidationContext<TRequest>(request);
var failures = _validators
.Select(v => v.Validate(context))
.SelectMany(r => r.Errors)
.Where(f => f is not null)
.ToList();
if (failures.Count != 0)
throw new ValidationException(failures);
return await next();
}Vorzeitiges Beenden
Ein Behavior kann den Handler vollständig überspringen, indem es zurückkehrt, ohne next() aufzurufen – nützlich zum Cachen von Abfrageergebnissen oder zum Zurückweisen ungültiger Requests.
if (_cache.TryGet(key, out TResponse cached))
return cached; // handler never runs
var response = await next();
_cache.Set(key, response);
return response;Behaviors anordnen
Behaviors werden in der Reihenfolge ihrer Registrierung ausgeführt. Platzieren Sie die Protokollierung außen, danach die Validierung und anschließend die Transaktionen, damit jedes Behavior das nächste korrekt umschließt.
services.AddTransient(typeof(IPipelineBehavior<,>), typeof(LoggingBehavior<,>));
services.AddTransient(typeof(IPipelineBehavior<,>), typeof(ValidationBehavior<,>));
services.AddTransient(typeof(IPipelineBehavior<,>), typeof(TransactionBehavior<,>));Ein Transaktions-Behavior
Umschließen Sie Command-Handler mit einer Datenbanktransaktion, damit der gesamte Vorgang atomar bestätigt oder zurückgerollt wird.
await using var tx = await _db.Database.BeginTransactionAsync(ct);
try
{
var response = await next();
await tx.CommitAsync(ct);
return response;
}
catch
{
await tx.RollbackAsync(ct);
throw;
}Auf bestimmte Requests beschränken
Verwenden Sie ein Marker-Interface und eine generische Einschränkung, damit ein Behavior nur auf dafür vorgesehene Requests angewendet wird – beispielsweise nur auf Commands für Transaktionen.
public interface ITransactional { }
public record CreateOrderCommand(...) : IRequest<int>, ITransactional;
// where TRequest : ITransactionalWarum Behaviors besser sind als Middleware
Im Gegensatz zu HTTP-Middleware werden Behaviors pro Nachricht ausgeführt, verfügen über den typisierten Request und die typisierte Antwort und funktionieren auch dann, wenn ein Request außerhalb von HTTP weitergeleitet wird (z. B. aus einem Hintergrundjob).
// Strongly typed, transport-independent cross-cutting logicKurztest
Bestätigen Sie, wie Behaviors funktionieren.
Zusammenfassung
Sie haben Pipeline-Behaviors kennengelernt:
IPipelineBehavior<TRequest, TResponse>umschließt jeden Request mit gemeinsamer Logik.- Der
next-Delegat führt die Pipeline weiter; wird er übersprungen, endet die Verarbeitung vorzeitig und der Handler wird nicht aufgerufen. - Häufige Anwendungen sind Protokollierung, Validierung, Transaktionen und Caching.
- Behaviors werden in Registrierungsreihenfolge ausgeführt und sind stark typisiert.
Als Nächstes: Notifications und Ereignisse.
Häufig gestellte Fragen
Ist die Lektion „Pipeline-Behaviors“ kostenlos?
Ja — der vollständige Text von „Pipeline-Behaviors“ 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 „Pipeline-Behaviors“?
Fügen Sie mit Behaviors querschnittliche Logik hinzu. 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 3 von 4.
Wie lange dauert die Lektion „Pipeline-Behaviors“?
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.