Comandos y handlers con MediatR
Envíe solicitudes a handlers específicos.
Comandos y handlers con MediatR es una lección gratuita de C# Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C# Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C# Academy incluye 4 lecciones en total.
Registrar MediatR
MediatR analiza los ensamblados para descubrir los handlers. Regístrelo una vez durante el inicio, indicándole un ensamblado que contenga los handlers.
builder.Services.AddMediatR(cfg =>
cfg.RegisterServicesFromAssembly(typeof(Program).Assembly));IRequest
Un mensaje que espera una respuesta implementa IRequest<TResponse>. El parámetro de tipo indica lo que devuelve el handler.
public record CreateOrderCommand(int CustomerId, string[] Items)
: IRequest<int>; // returns the new order idComandos sin resultado
Si un comando no devuelve nada significativo, implemente el IRequest no genérico (que es una abreviatura de IRequest<Unit>).
public record CancelOrderCommand(int OrderId) : IRequest;IRequestHandler
El handler implementa IRequestHandler<TRequest, TResponse> y proporciona el método Handle, donde se realiza el trabajo.
public class CreateOrderHandler
: IRequestHandler<CreateOrderCommand, int>
{
public Task<int> Handle(
CreateOrderCommand request, CancellationToken ct)
{
// create the order...
return Task.FromResult(newOrderId);
}
}Inyectar dependencias
Los handlers se resuelven mediante DI, por lo que pueden recibir un contexto de base de datos, repositorios u otros servicios a través del constructor.
public class CreateOrderHandler(AppDbContext db)
: IRequestHandler<CreateOrderCommand, int>
{
public async Task<int> Handle(
CreateOrderCommand request, CancellationToken ct)
{
var order = new Order { CustomerId = request.CustomerId };
db.Orders.Add(order);
await db.SaveChangesAsync(ct);
return order.Id;
}
}ISender
Para enviar una solicitud, inyecte ISender (o el IMediator más amplio) y llame a Send. MediatR encuentra el handler correspondiente.
public class OrdersController(ISender sender) : ControllerBase
{
[HttpPost]
public async Task<IActionResult> Create(CreateOrderCommand cmd)
{
int id = await sender.Send(cmd);
return CreatedAtAction(nameof(Get), new { id }, null);
}
}Usar Send en Minimal APIs
Las Minimal APIs inyectan ISender directamente en el delegado del endpoint.
app.MapPost("/orders", async (
CreateOrderCommand cmd, ISender sender) =>
{
var id = await sender.Send(cmd);
return Results.Created($"/orders/{id}", new { id });
});Las consultas son simplemente solicitudes
Las consultas utilizan la misma infraestructura de IRequest / IRequestHandler; la única diferencia es la intención: el handler lee y nunca modifica el estado.
public record GetOrderQuery(int Id) : IRequest<OrderDto?>;
public class GetOrderHandler(AppDbContext db)
: IRequestHandler<GetOrderQuery, OrderDto?>
{
public async Task<OrderDto?> Handle(
GetOrderQuery q, CancellationToken ct) =>
await db.Orders
.Where(o => o.Id == q.Id)
.Select(o => new OrderDto(o.Id, o.Total))
.SingleOrDefaultAsync(ct);
}Un handler por solicitud
Para Send, exactamente un handler debe coincidir con un tipo de solicitud. Registrar cero o dos handlers para la misma solicitud es un error de configuración.
// CreateOrderCommand -> exactly one CreateOrderHandlerDevolver resultados enriquecidos
Una respuesta puede ser de cualquier tipo: un DTO, un contenedor de resultados o incluso un resultado discriminado, lo que permite a los handlers expresar explícitamente el éxito y el error.
public record Result(bool Ok, string? Error);
public record PlaceOrderCommand(int Id) : IRequest<Result>;Probar un handler
Como un handler es una clase normal con dependencias inyectadas, puede probarlo directamente: sin HTTP ni necesidad de un controlador.
var handler = new CreateOrderHandler(inMemoryDb);
var id = await handler.Handle(
new CreateOrderCommand(1, ["sku-1"]), CancellationToken.None);
Assert.True(id > 0);Comprobación rápida
Confirme el modelo de envío de MediatR.
Resumen
Ha implementado comandos y handlers:
AddMediatRanaliza los ensamblados para registrar los handlers.- Los mensajes implementan
IRequest<T>; los handlers implementanIRequestHandler<TRequest, T>. - Inyecte
ISendery llame aSendpara enviar una solicitud; exactamente un handler coincide con ella. - Las consultas reutilizan la misma infraestructura y no tienen efectos secundarios.
A continuación: behaviors del pipeline.
Preguntas frecuentes
¿La lección «Comandos y handlers con MediatR» es gratis?
Sí — el texto completo de «Comandos y handlers con MediatR» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C# Academy, actualiza a CoddyKit PRO. El curso de C# Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Comandos y handlers con MediatR»?
Envíe solicitudes a handlers específicos. Practicas C# Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar C# Academy?
No se requiere experiencia previa. C# Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.
¿Cuánto tiempo toma la lección «Comandos y handlers con MediatR»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de C# Academy?
Sí. Cada lección de C# Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Conceptos de CQRS
- Comandos y handlers con MediatR
- Comportamientos del pipeline
- Notificaciones y eventos