0Pricing
C# Academy · Lektion

Benachrichtigungen und Events

Veröffentlichen Sie Domain-Events mit MediatR.

Benachrichtigungen und Events ist eine kostenlose C# Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C# Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.

Requests und Notifications

Ein Request hat einen Handler und gibt einen Wert zurück. Eine Notification ist ein Broadcast: Sie hat null oder mehr Handler und gibt nichts zurück. Verwenden Sie Notifications, um bekannt zu geben, dass etwas geschehen ist.

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

INotification

Ein Domänenereignis ist ein Record, der INotification implementiert. Es beschreibt eine Tatsache in der Vergangenheit.

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

INotificationHandler

Jeder Abonnent implementiert INotificationHandler<TNotification>. Mehrere Handler können dieselbe Benachrichtigung abonnieren und sie jeweils unabhängig verarbeiten.

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

Mehrere Abonnenten

Fügen Sie so viele Handler hinzu, wie Sie benötigen. Keiner von ihnen kennt die anderen – neue Reaktionen lassen sich hinzufügen, ohne den Publisher anzupassen.

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

Veröffentlichen

Um eine Benachrichtigung auszulösen, injizieren Sie IPublisher (oder IMediator) und rufen Sie Publish auf. Jeder registrierte Handler wird aufgerufen.

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;
    }
}

Seiteneffekte entkoppeln

Benachrichtigungen halten den eigentlichen Anwendungsfall fokussiert. Beim Aufgeben einer Bestellung wird lediglich die Bestellung gespeichert und ein Ereignis veröffentlicht; das Versenden von E-Mails und die Bestandsverwaltung befinden sich in eigenen Handlern. Das ist das Offen/Geschlossen-Prinzip in der Praxis.

// CreateOrderHandler does NOT know about email or inventory

Veröffentlichungsstrategie

Standardmäßig wartet MediatR sequentiell auf jeden Benachrichtigungs-Handler. Wenn einer eine Ausnahme auslöst, werden die nachfolgenden Handler nicht ausgeführt. Sie können einen benutzerdefinierten Publisher bereitstellen, um sie parallel auszuführen.

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

Umgang mit Fehlern

Da die Handler unabhängig voneinander sind, müssen Sie festlegen, was ein Fehler bedeutet. Fangen Sie bei nicht kritischen Seiteneffekten die Ausnahme innerhalb des Handlers ab und protokollieren Sie sie, damit ein Fehler die anderen nicht beeinträchtigt.

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

Muster für Domänenereignisse

Ein gängiges Muster besteht darin, dass Entitäten Domänenereignisse sammeln und Sie diese nach dem Speichern der Transaktion alle veröffentlichen. Dadurch wird garantiert, dass Ereignisse nur ausgelöst werden, wenn die Änderung festgeschrieben wurde.

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

Benachrichtigungen vs. Nachrichtenwarteschlangen

MediatR-Benachrichtigungen laufen innerhalb des Prozesses und synchron während der Anfrage ab. Für die zustellbare Kommunikation zwischen Services oder eine dauerhafte Zustellung veröffentlichen Sie stattdessen Nachrichten über einen echten Message Broker (z. B. RabbitMQ oder Azure Service Bus).

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

Benachrichtigungen testen

Sie können überprüfen, ob ein Handler das richtige Ereignis veröffentlicht, indem Sie einen Mock für IPublisher übergeben und verifizieren, dass er aufgerufen wurde.

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);

Kurzer Check

Überprüfen Sie Ihr Verständnis des Benachrichtigungsmodells.

Zusammenfassung

Sie haben Benachrichtigungen und Ereignisse kennengelernt:

  • INotification ist eine Broadcast-Nachricht mit null oder mehr INotificationHandlers.
  • Veröffentlichen Sie mit IPublisher.Publish, um alle Abonnenten aufzurufen.
  • Benachrichtigungen entkoppeln Seiteneffekte und folgen dem Offen/Geschlossen-Prinzip.
  • Sie laufen innerhalb des Prozesses ab; verwenden Sie für serviceübergreifende oder dauerhaft zuzustellende Ereignisse einen Broker.

Damit ist der CQRS- und MediatR-Kurs abgeschlossen.

Häufig gestellte Fragen

Ist die Lektion „Benachrichtigungen und Events“ kostenlos?

Ja — der vollständige Text von „Benachrichtigungen und Events“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C# Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Benachrichtigungen und Events“?

Veröffentlichen Sie Domain-Events mit MediatR. Du übst C# Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um C# Academy zu starten?

Keine Vorkenntnisse erforderlich. C# Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „Benachrichtigungen und Events“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser C# Academy-Lektion Code schreiben und ausführen?

Ja. Jede C# Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. CQRS-Konzepte
  2. Commands und Handler mit MediatR
  3. Pipeline-Behaviors
  4. Benachrichtigungen und Events
← Zurück zu C# Academy