0Pricing
C# Academy · Lección

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 id

Comandos 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 CreateOrderHandler

Devolver 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:

  • AddMediatR analiza los ensamblados para registrar los handlers.
  • Los mensajes implementan IRequest<T>; los handlers implementan IRequestHandler<TRequest, T>.
  • Inyecte ISender y llame a Send para 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

  1. Conceptos de CQRS
  2. Comandos y handlers con MediatR
  3. Comportamientos del pipeline
  4. Notificaciones y eventos
← Volver a C# Academy