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 handlersIPipelineBehavior
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 : ITransactionalPor 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 logicComprobació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
nexthace 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
- Conceptos de CQRS
- Comandos y handlers con MediatR
- Comportamientos del pipeline
- Notificaciones y eventos