Pre y Post Procesadores
Los procesadores son hooks ligeros que se ejecutan antes y después del handler. A diferencia de los behaviors, no envuelven la llamada — son efectos secundarios de tipo fire-and-forget.
Orden de Ejecución
PreProcessadores → [Pipeline Behaviors] → Handler → PostProcessadores
Pre-Procesadores
Se ejecutan antes de que el handler ejecute. Útiles para validación, logging, comprobaciones de autenticación.
public class AuditPreProcessor : IPreProcessor<CreateOrderCommand>
{
private readonly IAuditService _audit;
public AuditPreProcessor(IAuditService audit)
{
_audit = audit;
}
public async Task Process(CreateOrderCommand request, CancellationToken ct)
{
await _audit.RecordAttemptAsync("CreateOrder", ct);
}
}
Post-Procesadores
Se ejecutan después de que el handler ejecute. Útiles para logging de respuestas, publicar eventos, calentar caché.
public class OrderCreatedPostProcessor
: IPostProcessor<CreateOrderCommand, Result<string>>
{
private readonly IValiMediator _mediator;
public OrderCreatedPostProcessor(IValiMediator mediator)
{
_mediator = mediator;
}
public async Task Process(
CreateOrderCommand request,
Result<string> response,
CancellationToken ct)
{
if (response.IsSuccess)
{
await _mediator.Publish(
new OrderCreatedEvent(response.Value, request.CustomerId), ct);
}
}
}
Auto-Descubrimiento
Los procesadores se descubren automáticamente desde los assemblies escaneados — no se necesita registro manual:
builder.Services.AddValiMediator(config =>
{
// Todos IPreProcessor<> e IPostProcessor<,> en este assembly se registran automáticamente
config.RegisterServicesFromAssemblyContaining<Program>();
});
nota
IPreProcessor<TRequest>.Process()retornaTask(async)IPostProcessor<TRequest, TResponse>.Process()retornaTask(async)