Commandes et gestionnaires avec MediatR
Acheminez les requêtes vers des gestionnaires dédiés.
Commandes et gestionnaires avec MediatR est une leçon C# Academy gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage C# Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours C# Academy comprend 4 leçons au total.
Enregistrer MediatR
MediatR parcourt vos modules pour découvrir les gestionnaires. Enregistrez-le une fois au démarrage, en le faisant pointer vers un module qui contient vos gestionnaires.
builder.Services.AddMediatR(cfg =>
cfg.RegisterServicesFromAssembly(typeof(Program).Assembly));IRequest
Un message qui attend une réponse implémente IRequest<TResponse>. Le paramètre de type correspond à ce que renvoie le handler.
public record CreateOrderCommand(int CustomerId, string[] Items)
: IRequest<int>; // returns the new order idCommandes sans résultat
Si une commande ne renvoie rien de significatif, implémentez la version non générique de IRequest (qui est l’abréviation de IRequest<Unit>).
public record CancelOrderCommand(int OrderId) : IRequest;IRequestHandler
Le handler implémente IRequestHandler<TRequest, TResponse> et fournit la méthode Handle où le travail est effectué.
public class CreateOrderHandler
: IRequestHandler<CreateOrderCommand, int>
{
public Task<int> Handle(
CreateOrderCommand request, CancellationToken ct)
{
// create the order...
return Task.FromResult(newOrderId);
}
}Injecter des dépendances
Les handlers sont résolus depuis DI ; ils peuvent donc recevoir un context de base de données, des dépôts ou d’autres services par l’intermédiaire du constructeur.
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
Pour distribuer une requête, injectez ISender (ou l’IMediator plus général) et appelez Send. MediatR trouve le handler correspondant.
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);
}
}Utiliser Send dans les API minimales
Les API minimales injectent directement ISender dans le délégué du point de terminaison.
app.MapPost("/orders", async (
CreateOrderCommand cmd, ISender sender) =>
{
var id = await sender.Send(cmd);
return Results.Created($"/orders/{id}", new { id });
});Les requêtes sont simplement des demandes
Les requêtes utilisent les mêmes mécanismes IRequest / IRequestHandler ; la seule différence tient à l’intention : le handler lit les données et ne les modifie jamais.
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 par requête
Pour Send, exactement un handler doit correspondre à un type de requête. L’enregistrement de zéro ou de deux handlers pour la même requête constitue une erreur de configuration.
// CreateOrderCommand -> exactly one CreateOrderHandlerRenvoyer des résultats détaillés
Une réponse peut être de n’importe quel type : un objet de transfert de données, une enveloppe de résultat, voire une issue discriminée, ce qui permet aux handlers d’exprimer explicitement la réussite et l’échec.
public record Result(bool Ok, string? Error);
public record PlaceOrderCommand(int Id) : IRequest<Result>;Tester un handler
Comme un handler est une simple classe avec des dépendances injectées, vous le testez directement : aucun protocole HTTP ni contrôleur n’est nécessaire.
var handler = new CreateOrderHandler(inMemoryDb);
var id = await handler.Handle(
new CreateOrderCommand(1, ["sku-1"]), CancellationToken.None);
Assert.True(id > 0);Vérification rapide
Vérifiez que vous comprenez le modèle de distribution de MediatR.
Récapitulatif
Vous avez implémenté des commandes et des handlers :
AddMediatRparcourt les modules pour enregistrer les handlers.- Les messages implémentent
IRequest<T>; les handlers implémententIRequestHandler<TRequest, T>. - Injectez
ISenderet appelezSendpour distribuer une requête ; un seul handler lui correspond exactement. - Les requêtes réutilisent les mêmes mécanismes et restent exemptes d’effets secondaires.
Ensuite : les comportements de la chaîne de traitement.
Questions Fréquemment Posées
La leçon « Commandes et gestionnaires avec MediatR » est-elle gratuite ?
Oui — le texte complet de « Commandes et gestionnaires avec MediatR » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours C# Academy, passe à CoddyKit PRO. Le cours C# Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Commandes et gestionnaires avec MediatR » ?
Acheminez les requêtes vers des gestionnaires dédiés. Tu pratiques C# Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer C# Academy ?
Aucune expérience préalable n'est requise. C# Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.
Combien de temps prend la leçon « Commandes et gestionnaires avec MediatR » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon C# Academy ?
Oui. Chaque leçon C# Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Concepts de CQRS
- Commandes et gestionnaires avec MediatR
- Comportements du pipeline
- Notifications et événements