0Pricing
C# Academy · Lezione

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-forget

INotification

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 inventory

Strategia 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 broker

Test 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.Publish invoca 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

  1. Concetti di CQRS
  2. Comandi e gestori con MediatR
  3. Comportamenti della pipeline
  4. Notifiche ed eventi
← Torna a C# Academy