0Pricing
C# Academy · Lección

Comportamientos del pipeline

Añada lógica transversal mediante behaviors.

Comportamientos del pipeline es una lección gratuita de C# Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C# Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C# Academy incluye 4 lecciones en total.

Aspectos transversales

El registro, la validación, la medición de tiempos y las transacciones se aplican a muchos handlers. Copiar ese código en cada handler es repetitivo y propenso a errores.

Los pipeline behaviors de MediatR permiten envolver cada solicitud con lógica compartida.

// One behavior runs around all handlers

IPipelineBehavior

Un behavior implementa IPipelineBehavior<TRequest, TResponse>. Su método Handle recibe la solicitud y un delegado next que invoca el resto del pipeline.

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;
    }
}

El delegado next

next() llama al siguiente behavior o al handler real si este es el último. El código anterior a la llamada se ejecuta al entrar; el código posterior, al salir.

// [Behavior A in] -> [Behavior B in] -> [Handler]
//               <- [Behavior B out] <- [A out]

Un behavior de registro

Un behavior de registro concreto registra el nombre de la solicitud al entrar y el tiempo transcurrido al salir.

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;
}

Registrar un behavior

Registre el behavior genérico abierto en DI. MediatR lo aplica a cada solicitud.

builder.Services.AddTransient(
    typeof(IPipelineBehavior<,>),
    typeof(LoggingBehavior<,>));

Un behavior de validación

Un uso habitual es validar las solicitudes con FluentValidation. El behavior ejecuta todos los validadores antes de que se ejecute el handler y genera una excepción si alguno falla.

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();
}

Cortocircuito

Un behavior puede omitir completamente el handler si devuelve el control sin llamar a next(); resulta útil para almacenar en caché los resultados de las consultas o rechazar solicitudes no válidas.

if (_cache.TryGet(key, out TResponse cached))
    return cached;          // handler never runs
var response = await next();
_cache.Set(key, response);
return response;

Orden de los behaviors

Los behaviors se ejecutan en el orden en que se registran. Coloque el registro en la capa más externa, seguido de la validación y después de las transacciones, para que cada uno envuelva correctamente al siguiente.

services.AddTransient(typeof(IPipelineBehavior<,>), typeof(LoggingBehavior<,>));
services.AddTransient(typeof(IPipelineBehavior<,>), typeof(ValidationBehavior<,>));
services.AddTransient(typeof(IPipelineBehavior<,>), typeof(TransactionBehavior<,>));

Un behavior transaccional

Envuelva los handlers de comandos en una transacción de base de datos para que toda la operación se confirme o revierta de forma atómica.

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;
}

Dirigirse a solicitudes específicas

Use una interfaz marcadora y una restricción genérica para que un behavior solo se aplique a las solicitudes que lo habiliten; por ejemplo, que solo los comandos usen transacciones.

public interface ITransactional { }
public record CreateOrderCommand(...) : IRequest<int>, ITransactional;

// where TRequest : ITransactional

Por qué los behaviors superan al middleware

A diferencia del middleware HTTP, los behaviors se ejecutan por mensaje, tienen acceso a la solicitud y la respuesta tipadas, y funcionan incluso cuando una solicitud se envía fuera de HTTP (por ejemplo, desde un trabajo en segundo plano).

// Strongly typed, transport-independent cross-cutting logic

Comprobación rápida

Confirme cómo funcionan los behaviors.

Resumen

Ha aprendido los behaviors del pipeline:

  • IPipelineBehavior<TRequest, TResponse> envuelve cada solicitud con lógica compartida.
  • El delegado next hace avanzar el pipeline; omitirlo provoca un cortocircuito del handler.
  • Usos habituales: registro, validación, transacciones y almacenamiento en caché.
  • Los behaviors se ejecutan en el orden de registro y tienen tipos fuertes.

A continuación: notificaciones y eventos.

Preguntas frecuentes

¿La lección «Comportamientos del pipeline» es gratis?

Sí — el texto completo de «Comportamientos del pipeline» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C# Academy, actualiza a CoddyKit PRO. El curso de C# Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Comportamientos del pipeline»?

Añada lógica transversal mediante behaviors. Practicas C# Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar C# Academy?

No se requiere experiencia previa. C# Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «Comportamientos del pipeline»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de C# Academy?

Sí. Cada lección de C# Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Conceptos de CQRS
  2. Comandos y handlers con MediatR
  3. Comportamientos del pipeline
  4. Notificaciones y eventos
← Volver a C# Academy