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 idComandos 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 CreateOrderHandlerRetornando 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:
AddMediatRexamina conjuntos para registrar handlers.- As mensagens implementam
IRequest<T>; os handlers implementamIRequestHandler<TRequest, T>. - Injete
ISendere chameSendpara 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
- Conceitos de CQRS
- Comandos e manipuladores com MediatR
- Comportamentos de pipeline
- Notificações e eventos