Solicitudes y Comandos
Las solicitudes son el mecanismo principal de despacho en Vali-Mediator. Cada solicitud tiene exactamente un handler.
Definir Solicitudes
Con Respuesta
// Una consulta que retorna datos
public record GetProductQuery(Guid ProductId) : IRequest<Result<ProductDto>>;
// Un comando que retorna un ID creado
public record CreateProductCommand(string Name, decimal Price) : IRequest<Result<Guid>>;
Solicitudes Void
Para operaciones sin valor de retorno, usa IRequest (atajo de IRequest<Unit>):
public record DeleteProductCommand(Guid ProductId) : IRequest;
Implementar Handlers
public class GetProductHandler : IRequestHandler<GetProductQuery, Result<ProductDto>>
{
private readonly IProductRepository _repository;
public GetProductHandler(IProductRepository repository)
{
_repository = repository;
}
public async Task<Result<ProductDto>> Handle(
GetProductQuery request,
CancellationToken cancellationToken)
{
var product = await _repository.FindByIdAsync(request.ProductId, cancellationToken);
if (product is null)
return Result<ProductDto>.Fail("Producto no encontrado.", ErrorType.NotFound);
return Result<ProductDto>.Ok(new ProductDto(product.Id, product.Name, product.Price));
}
}
Handler Void
public class DeleteProductHandler : IRequestHandler<DeleteProductCommand>
{
public async Task<Unit> Handle(DeleteProductCommand request, CancellationToken ct)
{
await _repository.DeleteAsync(request.ProductId, ct);
return Unit.Value;
}
}
SendOrDefault
Retorna default en lugar de lanzar excepción cuando no hay handler registrado:
ProductDto? product = await _mediator.SendOrDefault(new GetProductQuery(productId));
SendAll
Ejecuta múltiples solicitudes del mismo tipo de respuesta en paralelo:
var queries = new[]
{
new GetProductQuery(id1),
new GetProductQuery(id2),
new GetProductQuery(id3),
};
Result<ProductDto>[] results = await _mediator.SendAll(queries);