Notifiche ed eventi
Pubblichi eventi di dominio con MediatR.
Notifiche ed eventi è una lezione C# Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C# Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C# Academy include 4 lezioni in totale.
Richieste e notifiche
Una richiesta ha un handler e restituisce un valore. Una notifica è una trasmissione a più destinatari: ha zero o più handler e non restituisce nulla. Utilizzi le notifiche per annunciare che qualcosa è accaduto.
// Request: one handler, returns a result
// Notification: many handlers, fire-and-forgetINotification
Un evento di dominio è un record che implementa INotification. Descrive un fatto al passato.
public record OrderPlacedNotification(int OrderId, int CustomerId)
: INotification;INotificationHandler
Ogni sottoscrittore implementa INotificationHandler<TNotification>. Più gestori possono sottoscrivere la stessa notifica, gestendola ciascuno in modo indipendente.
public class SendConfirmationEmailHandler
: INotificationHandler<OrderPlacedNotification>
{
public Task Handle(
OrderPlacedNotification n, CancellationToken ct)
{
// send the email...
return Task.CompletedTask;
}
}Più sottoscrittori
Aggiunga tutti i gestori necessari. Nessuno di essi conosce gli altri: è possibile aggiungere nuove reazioni senza modificare il pubblicatore.
public class UpdateInventoryHandler
: INotificationHandler<OrderPlacedNotification>
{
public Task Handle(OrderPlacedNotification n, CancellationToken ct)
{
// decrement stock...
return Task.CompletedTask;
}
}Pubblicazione
Per generare una notifica, inietti IPublisher (o IMediator) e chiami Publish. Viene invocato ogni gestore registrato.
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;
}
}Disaccoppiamento degli effetti collaterali
Le notifiche mantengono il caso d'uso principale focalizzato. La creazione di un ordine si limita a registrare l'ordine e pubblicare un evento; l'invio di email e la gestione dell'inventario risiedono nei rispettivi gestori. Questo è il principio open/closed in azione.
// CreateOrderHandler does NOT know about email or inventoryStrategia di pubblicazione
Per impostazione predefinita, MediatR attende ogni gestore di notifiche in modo sequenziale. Se uno genera un'eccezione, i gestori successivi non vengono eseguiti. È possibile fornire un pubblicatore personalizzato per eseguirli in parallelo.
builder.Services.AddMediatR(cfg =>
{
cfg.RegisterServicesFromAssembly(typeof(Program).Assembly);
cfg.NotificationPublisher = new TaskWhenAllPublisher();
});Gestione degli errori
Poiché i gestori sono indipendenti, stabilisca cosa debba significare un errore. Per gli effetti collaterali non critici, intercetti l'errore e lo registri nel gestore, così un errore non bloccherà gli altri.
public async Task Handle(OrderPlacedNotification n, CancellationToken ct)
{
try { await _email.SendAsync(n.CustomerId, ct); }
catch (Exception ex) { _logger.LogError(ex, "email failed"); }
}Pattern degli eventi di dominio
Un pattern comune consiste nel far raccogliere alle entità gli eventi di dominio e pubblicarli tutti dopo aver salvato la transazione. In questo modo si garantisce che gli eventi vengano generati solo quando la modifica è stata confermata.
await db.SaveChangesAsync(ct);
foreach (var domainEvent in order.Events)
await publisher.Publish(domainEvent, ct);
order.Events.Clear();Notifiche e code di messaggi
Le notifiche di MediatR sono in-process e sincrone all'interno della richiesta. Per la consegna tra servizi o persistente, pubblichi invece i messaggi su un vero message broker, ad esempio RabbitMQ o Azure Service Bus.
// In-process reactions -> MediatR notifications
// Cross-service / durable -> message brokerTest delle notifiche
Può verificare che un gestore pubblichi l'evento corretto passando un mock di IPublisher e verificando che sia stato chiamato.
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);Verifica rapida
Confermi di aver compreso il modello delle notifiche.
Riepilogo
Ha appreso le notifiche e gli eventi:
INotificationè una trasmissione broadcast con zero o piùINotificationHandler.- Pubblicare con
IPublisher.Publishinvoca tutti i sottoscrittori. - Le notifiche disaccoppiano gli effetti collaterali e seguono il principio open/closed.
- Sono in-process; per gli eventi tra servizi o persistenti utilizzi un broker.
Questo completa il corso su CQRS e MediatR.
Domande Frequenti
La lezione «Notifiche ed eventi» è gratuita?
Sì — il testo completo di «Notifiche ed eventi» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C# Academy, passa a CoddyKit PRO. Il corso C# Academy include 4 lezioni in totale.
Cosa imparerò in «Notifiche ed eventi»?
Pubblichi eventi di dominio con MediatR. Eserciti C# Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare C# Academy?
Non è richiesta alcuna esperienza precedente. C# Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.
Quanto tempo richiede la lezione «Notifiche ed eventi»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione C# Academy?
Sì. Ogni lezione C# Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Concetti di CQRS
- Comandi e gestori con MediatR
- Comportamenti della pipeline
- Notifiche ed eventi