Pipelinemønstre
Legg til tverrgående logikk med behaviors.
Pipelinemønstre er en gratis leksjon i C# Academy på CoddyKit. Dette er leksjon 3 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i C# Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i C# Academy inneholder totalt 4 leksjoner.
Tverrgående funksjonalitet
Logging, validering, tidsmåling og transaksjoner gjelder for mange handlere. Det er både repetitivt og feilutsatt å kopiere denne koden inn i hver handler.
MediatRs pipeline behaviors lar Dem pakke inn hver forespørsel med felles logikk.
// One behavior runs around all handlersIPipelineBehavior
En behavior implementerer IPipelineBehavior<TRequest, TResponse>. Metoden Handle mottar forespørselen og en next-delegat som kaller resten av pipelineen.
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;
}
}Neste delegat
next() kaller neste behavior, eller selve handleren hvis dette er den siste. Kode før kallet kjører på vei inn, mens kode etter kallet kjører på vei ut.
// [Behavior A in] -> [Behavior B in] -> [Handler]
// <- [Behavior B out] <- [A out]En logging-behavior
En konkret logging-behavior registrerer navnet på forespørselen på vei inn og tiden som har gått på vei ut.
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;
}Registrere en behavior
Registrer den åpne generiske behavioren i DI. MediatR bruker den på hver forespørsel.
builder.Services.AddTransient(
typeof(IPipelineBehavior<,>),
typeof(LoggingBehavior<,>));En validerings-behavior
En vanlig bruk er forespørselsvalidering med FluentValidation. Behavioren kjører alle validatorene før handleren utføres og kaster et unntak hvis noen feiler.
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();
}Avbryte pipelineen tidlig
En behavior kan hoppe over handleren fullstendig ved å returnere uten å kalle next() – nyttig for caching av spørringsresultater eller avvisning av ugyldige forespørsler.
if (_cache.TryGet(key, out TResponse cached))
return cached; // handler never runs
var response = await next();
_cache.Set(key, response);
return response;Rekkefølge på behaviors
Behaviors kjøres i den rekkefølgen de registreres. Plasser logging ytterst, deretter validering og så transaksjoner, slik at hver behavior pakker inn den neste på riktig måte.
services.AddTransient(typeof(IPipelineBehavior<,>), typeof(LoggingBehavior<,>));
services.AddTransient(typeof(IPipelineBehavior<,>), typeof(ValidationBehavior<,>));
services.AddTransient(typeof(IPipelineBehavior<,>), typeof(TransactionBehavior<,>));En transaksjons-behavior
Pakk kommandohandlere inn i en databasetransaksjon, slik at hele operasjonen enten bekreftes eller rulles tilbake atomisk.
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;
}Målrette bestemte forespørsler
Bruk et markørgrensesnitt og en generisk begrensning, slik at en behavior bare gjelder forespørsler som aktivt velger den – for eksempel at bare kommandoer får transaksjoner.
public interface ITransactional { }
public record CreateOrderCommand(...) : IRequest<int>, ITransactional;
// where TRequest : ITransactionalHvorfor behaviors er bedre enn middleware
I motsetning til HTTP-middleware kjører behaviors per melding, har tilgang til den typede forespørselen og responsen, og fungerer selv når en forespørsel sendes utenfor HTTP (for eksempel fra en bakgrunnsjobb).
// Strongly typed, transport-independent cross-cutting logicRask kontroll
Bekreft hvordan behaviors fungerer.
Oppsummering
De har lært om pipeline behaviors:
IPipelineBehavior<TRequest, TResponse>pakker inn hver forespørsel med felles logikk.next-delegaten fører pipelineen videre; hvis den hoppes over, avbrytes handleren.- Vanlige bruksområder er logging, validering, transaksjoner og caching.
- Behaviors kjører i registreringsrekkefølgen og er sterkt typede.
Deretter: notifikasjoner og hendelser.
Lær deg C# med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 93
- Leksjoner
- 346
Ofte stilte spørsmål
Er leksjonen «Pipelinemønstre» gratis?
Ja – hele teksten i «Pipelinemønstre» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av C# Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i C# Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Pipelinemønstre»?
Legg til tverrgående logikk med behaviors. Du øver på C# Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med C# Academy?
Ingen tidligere erfaring er nødvendig. C# Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.
Hvor lang tid tar leksjonen «Pipelinemønstre»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne C# Academy-leksjonen?
Ja. Alle C# Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.