Saltar al contenido principal

Integración en Handlers

ResilienceBehavior<TRequest, TResponse> intercepta cada request despachado por Vali-Mediator y envuelve automáticamente la ejecución del handler con la política resuelta — sin cambios en el handler.

Cómo Funciona

loading...

Registro

builder.Services.AddValiMediator(config =>
{
config.RegisterServicesFromAssemblyContaining<Program>();
config.AddResilienceBehavior();
});

Recomendado: Policy Providers

La forma preferida de asociar una política es mediante AddResiliencePolicy<T> o IResiliencePolicyProvider<TRequest>. Esto mantiene el comando limpio — sin propiedades de infraestructura mezcladas en el modelo de dominio.

Ver Policy Providers para la guía completa.

// Comando — datos de dominio puros, sin propiedad Policy
public class PlaceOrderCommand : IRequest<Result<string>>
{
public string OrderId { get; init; } = string.Empty;
public decimal Amount { get; init; }
}

// Política registrada en startup
services.AddResiliencePolicy<PlaceOrderCommand>(_ =>
ResiliencePolicy.Create("place-order")
.Retry(3)
.CircuitBreaker(opts =>
{
opts.CircuitKey = "payment-gateway";
opts.FailureThreshold = 5;
opts.BreakDuration = TimeSpan.FromSeconds(30);
})
.Timeout(TimeSpan.FromSeconds(10))
.Build());

Deprecado: IResilient en el Comando

Deprecado en v1.2.0

IResilient se mantiene por compatibilidad pero no debe usarse en código nuevo. Poner una propiedad ResiliencePolicy en el comando mezcla infraestructura con datos de dominio — el objeto policy se serializa junto con los campos del comando. Usá services.AddResiliencePolicy<T>() en su lugar.

// ❌ Enfoque antiguo — política en el comando
[Obsolete]
public class CallPaymentGatewayCommand : IRequest<Result<PaymentDto>>, IResilient
{
public string OrderId { get; init; } = string.Empty;

private static readonly ResiliencePolicy _policy = ResiliencePolicy
.Create("payment-gateway")
.Retry(3)
.Timeout(TimeSpan.FromSeconds(10))
.Build();

public ResiliencePolicy Policy => _policy;
}
// ✅ Enfoque nuevo — política separada del comando
public class CallPaymentGatewayCommand : IRequest<Result<PaymentDto>>
{
public string OrderId { get; init; } = string.Empty;
}

services.AddResiliencePolicy<CallPaymentGatewayCommand>(_ =>
ResiliencePolicy.Create("payment-gateway")
.Retry(3)
.Timeout(TimeSpan.FromSeconds(10))
.Build());

Orden de Resolución

PrioridadMecanismo
1AddResiliencePolicy<T> / AddResiliencePolicyProvider<T,P>
2IResilient en el comando (deprecado)
3AddGlobalResiliencePolicy
Sin política → el request pasa sin modificaciones