Saltar al contenido principal

Idempotencia

Vali-Mediator.Idempotency previene el procesamiento duplicado de solicitudes almacenando resultados y retornando resultados cacheados para solicitudes repetidas con la misma clave de idempotencia.

Instalación

dotnet add package Vali-Mediator.Idempotency

Configuración

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

builder.Services.AddInMemoryIdempotencyStore();

Cómo Funciona

loading...

Marcar una Solicitud como Idempotente

public record ProcessPaymentCommand(
Guid OrderId,
decimal Amount,
string CardToken) : IRequest<Result<string>>, IIdempotent
{
// Clave única para este intento de pago específico
public string IdempotencyKey => $"payment:{OrderId}";

// Cuánto tiempo recordar este resultado
public TimeSpan Expiration => TimeSpan.FromHours(24);
}

Patrón de Uso con API HTTP

app.MapPost("/payments", async (
[FromHeader(Name = "Idempotency-Key")] string idempotencyKey,
PaymentRequest body,
IValiMediator mediator) =>
{
var command = new ProcessPaymentCommand(
IdempotencyKey: idempotencyKey,
Amount: body.Amount,
Token: body.CardToken);

Result<PaymentDto> result = await mediator.Send(command);
return result.ToHttpResult();
});
tip

Usa UUIDs como claves de idempotencia y deja que los clientes las generen. Esto permite a los clientes reintentar solicitudes fallidas de forma segura sin riesgo de procesamiento doble.

Serialización

Los resultados se serializan usando IIdempotencySerializer (por defecto: JsonIdempotencySerializer usando System.Text.Json). Los bytes serializados se almacenan en el store de idempotencia.