0Pricing
C# Academy · Leçon

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 id

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

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

  • AddMediatR parcourt les modules pour enregistrer les handlers.
  • Les messages implémentent IRequest<T> ; les handlers implémentent IRequestHandler<TRequest, T>.
  • Injectez ISender et appelez Send pour 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

  1. Concepts de CQRS
  2. Commandes et gestionnaires avec MediatR
  3. Comportements du pipeline
  4. Notifications et événements
← Retour à C# Academy