C# Academy · leksjon

Pipelinemønstre

Legg til tverrgående logikk med behaviors.

Leksjon 3 av 413 trinn

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 handlers

IPipelineBehavior

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

Hvorfor 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 logic

Rask 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.

Gratis å komme i gang

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.

Alle leksjonene i dette kurset

  1. CQRS-konsepter
  2. Kommandoer og behandlere med MediatR
  3. Pipelinemønstre
  4. Varsler og hendelser
← Tilbake til C# Academy