0Pricing
C# Academy · Aula

Comandos e manipuladores com MediatR

Encaminhe solicitações para manipuladores dedicados.

Comandos e manipuladores com MediatR é uma aula grátis de C# Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C# Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C# Academy inclui 4 aulas no total.

Registrando o MediatR

O MediatR examina seus conjuntos para descobrir handlers. Registre-o uma vez na inicialização, indicando um conjunto que contenha seus handlers.

builder.Services.AddMediatR(cfg =>
    cfg.RegisterServicesFromAssembly(typeof(Program).Assembly));

IRequest

Uma mensagem que espera uma resposta implementa IRequest<TResponse>. O parâmetro de tipo representa o que o handler retorna.

public record CreateOrderCommand(int CustomerId, string[] Items)
    : IRequest<int>;   // returns the new order id

Comandos sem resultado

Se um comando não retorna nada significativo, implemente o IRequest não genérico (que é uma abreviação de IRequest<Unit>).

public record CancelOrderCommand(int OrderId) : IRequest;

Handler de solicitações

O handler implementa IRequestHandler<TRequest, TResponse> e fornece o método Handle, no qual o trabalho acontece.

public class CreateOrderHandler
    : IRequestHandler<CreateOrderCommand, int>
{
    public Task<int> Handle(
        CreateOrderCommand request, CancellationToken ct)
    {
        // create the order...
        return Task.FromResult(newOrderId);
    }
}

Injetando dependências

Os handlers são resolvidos por DI, portanto podem receber um contexto de banco de dados, repositórios ou outros serviços por meio do construtor.

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;
    }
}

Remetente

Para encaminhar uma solicitação, injete ISender (ou o IMediator mais abrangente) e chame Send. O MediatR encontra o handler correspondente.

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);
    }
}

Send em APIs mínimas

As APIs mínimas injetam ISender diretamente no delegado do ponto de extremidade.

app.MapPost("/orders", async (
    CreateOrderCommand cmd, ISender sender) =>
{
    var id = await sender.Send(cmd);
    return Results.Created($"/orders/{id}", new { id });
});

Consultas são apenas solicitações

As consultas usam o mesmo mecanismo de IRequest / IRequestHandler — a única diferença é a intenção: o handler lê e nunca altera dados.

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);
}

Um handler por solicitação

Para Send, exatamente um handler deve corresponder a um tipo de solicitação. Registrar nenhum ou dois objetos handler para a mesma solicitação é um erro de configuração.

// CreateOrderCommand -> exactly one CreateOrderHandler

Retornando resultados completos

Uma resposta pode ser de qualquer tipo — um objeto de transferência de dados, um contêiner de resultado ou até mesmo um resultado discriminado — permitindo que os handlers expressem sucesso e falha explicitamente.

public record Result(bool Ok, string? Error);
public record PlaceOrderCommand(int Id) : IRequest<Result>;

Testando um handler

Como um handler é uma classe comum com dependências injetadas, você o testa diretamente — sem HTTP e sem precisar de um controlador.

var handler = new CreateOrderHandler(inMemoryDb);
var id = await handler.Handle(
    new CreateOrderCommand(1, ["sku-1"]), CancellationToken.None);
Assert.True(id > 0);

Verificação rápida

Confirme o modelo de encaminhamento do MediatR.

Recapitulação

Você implementou comandos e handlers:

  • AddMediatR examina conjuntos para registrar handlers.
  • As mensagens implementam IRequest<T>; os handlers implementam IRequestHandler<TRequest, T>.
  • Injete ISender e chame Send para encaminhar; exatamente um handler corresponde a cada mensagem.
  • As consultas reutilizam o mesmo mecanismo e permanecem sem efeitos colaterais.

Próximo tópico: comportamentos do canal de processamento.

Perguntas Frequentes

A aula “Comandos e manipuladores com MediatR” é grátis?

Sim — o texto completo de “Comandos e manipuladores com MediatR” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C# Academy, atualize para CoddyKit PRO. O curso de C# Academy inclui 4 aulas no total.

O que vou aprender em “Comandos e manipuladores com MediatR”?

Encaminhe solicitações para manipuladores dedicados. Você pratica C# Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar C# Academy?

Nenhuma experiência prévia é necessária. C# Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.

Quanto tempo leva a aula “Comandos e manipuladores com MediatR”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de C# Academy?

Sim. Cada aula de C# Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Conceitos de CQRS
  2. Comandos e manipuladores com MediatR
  3. Comportamentos de pipeline
  4. Notificações e eventos
← Voltar para C# Academy