C# Academy · Leçon

Notifications et événements

Publiez des événements de domaine avec MediatR.

Leçon 4 sur 413 étapes

Notifications et événements est une leçon C# Academy gratuite sur CoddyKit. Ceci est la leçon 4 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.

Requêtes et notifications

Une requête possède un handler et renvoie une valeur. Une notification est une diffusion : elle possède zéro ou plusieurs gestionnaires et ne renvoie rien. Utilisez les notifications pour annoncer qu’un événement s’est produit.

// Request:      one handler, returns a result
// Notification: many handlers, fire-and-forget

INotification

Un événement de domaine est un enregistrement qui implémente INotification. Il décrit un fait formulé au passé.

public record OrderPlacedNotification(int OrderId, int CustomerId)
    : INotification;

INotificationHandler

Chaque abonné implémente INotificationHandler<TNotification>. Plusieurs gestionnaires peuvent s’abonner à la même notification et la traiter indépendamment.

public class SendConfirmationEmailHandler
    : INotificationHandler<OrderPlacedNotification>
{
    public Task Handle(
        OrderPlacedNotification n, CancellationToken ct)
    {
        // send the email...
        return Task.CompletedTask;
    }
}

Plusieurs abonnés

Ajoutez autant de gestionnaires que nécessaire. Aucun ne connaît les autres : vous pouvez ajouter de nouvelles réactions sans modifier le producteur.

public class UpdateInventoryHandler
    : INotificationHandler<OrderPlacedNotification>
{
    public Task Handle(OrderPlacedNotification n, CancellationToken ct)
    {
        // decrement stock...
        return Task.CompletedTask;
    }
}

Publication

Pour déclencher une notification, injectez IPublisher (ou IMediator), puis appelez Publish. Chaque gestionnaire enregistré est appelé.

public class CreateOrderHandler(AppDbContext db, IPublisher publisher)
    : IRequestHandler<CreateOrderCommand, int>
{
    public async Task<int> Handle(CreateOrderCommand c, CancellationToken ct)
    {
        var order = new Order { CustomerId = c.CustomerId };
        db.Orders.Add(order);
        await db.SaveChangesAsync(ct);
        await publisher.Publish(
            new OrderPlacedNotification(order.Id, c.CustomerId), ct);
        return order.Id;
    }
}

Découpler les effets secondaires

Les notifications permettent de garder le cas d’utilisation principal ciblé. Le passage d’une commande se contente d’enregistrer la commande et de publier un événement ; l’envoi d’e-mails et la gestion des stocks résident dans leurs propres gestionnaires. C’est le principe ouvert/fermé en action.

// CreateOrderHandler does NOT know about email or inventory

Stratégie de publication

Par défaut, MediatR attend chaque gestionnaire de notification séquentiellement. Si l’un d’eux lève une exception, les gestionnaires suivants ne sont pas exécutés. Vous pouvez fournir un producteur personnalisé pour les exécuter en parallèle.

builder.Services.AddMediatR(cfg =>
{
    cfg.RegisterServicesFromAssembly(typeof(Program).Assembly);
    cfg.NotificationPublisher = new TaskWhenAllPublisher();
});

Gestion des échecs

Comme les gestionnaires sont indépendants, vous devez décider de la signification d’un échec. Pour les effets secondaires non critiques, interceptez l’exception et journalisez-la dans le gestionnaire afin qu’un échec n’interrompe pas les autres.

public async Task Handle(OrderPlacedNotification n, CancellationToken ct)
{
    try { await _email.SendAsync(n.CustomerId, ct); }
    catch (Exception ex) { _logger.LogError(ex, "email failed"); }
}

Modèle des événements de domaine

Un modèle courant consiste à faire recueillir les événements de domaine par les entités, puis à tous les publier après l’enregistrement de la transaction. Cela garantit que les événements ne sont déclenchés qu’une fois la modification validée.

await db.SaveChangesAsync(ct);
foreach (var domainEvent in order.Events)
    await publisher.Publish(domainEvent, ct);
order.Events.Clear();

Notifications et files de messages

Les notifications MediatR s’exécutent au sein du processus et de manière synchrone pendant la requête. Pour une livraison interservices ou persistante, publiez plutôt les messages auprès d’un véritable courtier de messages (par exemple RabbitMQ ou Azure Service Bus).

// In-process reactions  -> MediatR notifications
// Cross-service / durable -> message broker

Tester les notifications

Vous pouvez vérifier qu’un gestionnaire publie le bon événement en lui transmettant une doublure de IPublisher et en vérifiant qu’il a été appelé.

var publisher = new Mock<IPublisher>();
var handler = new CreateOrderHandler(db, publisher.Object);
await handler.Handle(new CreateOrderCommand(1, []), default);
publisher.Verify(p => p.Publish(
    It.IsAny<OrderPlacedNotification>(), default), Times.Once);

Vérification rapide

Vérifiez le modèle de notification.

Récapitulatif

Vous avez appris à utiliser les notifications et les événements :

  • INotification est une diffusion destinée à zéro ou plusieurs INotificationHandlers.
  • Publiez avec IPublisher.Publish pour appeler tous les abonnés.
  • Les notifications découplent les effets secondaires et suivent le principe ouvert/fermé.
  • Elles s’exécutent au sein du processus ; utilisez un courtier pour les événements interservices ou persistants.

Le cours sur CQRS et MediatR est maintenant terminé.

Gratuit pour commencer

Apprends C# avec un tuteur IA — gratuit

Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.

Cours
93
Leçons
346

Questions Fréquemment Posées

La leçon « Notifications et événements » est-elle gratuite ?

Oui — le texte complet de « Notifications et événements » 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 « Notifications et événements » ?

Publiez des événements de domaine avec MediatR. 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 4 sur 4.

Combien de temps prend la leçon « Notifications et événements » ?

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