Notifications et événements
Publiez des événements de domaine avec MediatR.
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-forgetINotification
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 inventoryStraté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 brokerTester 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 :
INotificationest une diffusion destinée à zéro ou plusieursINotificationHandlers.- Publiez avec
IPublisher.Publishpour 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é.
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
- Concepts de CQRS
- Commandes et gestionnaires avec MediatR
- Comportements du pipeline
- Notifications et événements