Fuego y Olvida (Fire and Forget)
El patrón fire-and-forget despacha un comando a exactamente un handler sin valor de retorno. A diferencia de las notificaciones, no hay fan-out — un handler, una operación.
Definir Comandos Fire-and-Forget
public record SendAuditLogCommand(
string UserId,
string Action,
string Resource) : IFireAndForget;
Implementar el Handler
public class SendAuditLogHandler : IFireAndForgetHandler<SendAuditLogCommand>
{
private readonly IAuditRepository _auditRepository;
public SendAuditLogHandler(IAuditRepository auditRepository)
{
_auditRepository = auditRepository;
}
public async Task Handle(SendAuditLogCommand command, CancellationToken ct)
{
await _auditRepository.LogAsync(new AuditEntry
{
UserId = command.UserId,
Action = command.Action,
Resource = command.Resource,
Timestamp = DateTimeOffset.UtcNow
}, ct);
}
}
Despachar
Usa Dispatch para enviar un comando fire-and-forget:
await _mediator.Dispatch(new SendAuditLogCommand(
userId: currentUser.Id,
action: "CreateOrder",
resource: $"orders/{orderId}"));
Casos de Uso Comunes
- Auditoría — registrar acciones del usuario sin bloquear el flujo principal
- Invalidación de caché — invalidar una entrada de caché de forma asíncrona
- Telemetría — enviar métricas o trazas a sistemas externos
- Webhooks — disparar una notificación webhook
tip
Si necesitas que múltiples handlers reaccionen al mismo evento, usa INotification en su lugar. Fire-and-forget es para efectos secundarios de un solo handler.