Event-Driven-Architektur in C#: Wie man Ereignisse wie ein Profi verwaltet

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Warum wacht Ihr Code nur auf Anruf auf?

\n

Stellen Sie sich vor, Sie sind der Dispatcher in einem riesigen Flughafen. Flugzeuge kommen an, Passagiere eilen, Tanklastwagen manövrieren. Wenn Sie persönlich zu jedem Piloten gehen und fragen würden: „Na, gelandet? Und jetzt? Und jetzt?“ – Sie würden verrückt werden. Stattdessen sagen Sie: „Wenn Sie landen – rufen Sie an.“ Und das System funktioniert perfekt.

\n

Das ist die Event-Driven-Architektur in C#. Anstatt Objekte ständig abzufragen (Pull), abonnieren wir Ereignisse (Push). Der Code wird reaktiv, skalierbar und, was am wichtigsten ist, lebendig. In diesem Artikel werden wir untersuchen, wie man solche Systeme in C# von Grund auf mit den integrierten Sprachmechanismen und fortgeschrittenen Patterns aufbaut.

\n\n

Was ist Event-Driven-Architektur? Keine langweilige Theorie

\n

Event-Driven (ereignisorientierte) Architektur ist ein Ansatz, bei dem der Programmablauf durch Ereignisse bestimmt wird: Klicks, Nachrichten aus Warteschlangen, Datenänderungen oder externe Signale. In C# ist dieses Konzept direkt in die Sprache eingebaut, und zwar durch Delegaten (delegates) und Ereignisse (events).

\n

Das Hauptprinzip ist die lose Kopplung (loose coupling). Der Absender des Ereignisses (Herausgeber) weiß nichts über die Empfänger (Abonnenten). Er ruft nur: „Etwas Wichtiges ist passiert!“ – und wer wie darauf reagiert, wird dynamisch entschieden.

\n

Warum ist das für reale Projekte großartig?

\n
    \n
  • Skalierbarkeit: Einen neuen Abonnenten hinzuzufügen ist, als würde man ihn für einen Newsletter anmelden. Der Code des Herausgebers ändert sich nicht.
  • \n
  • Testbarkeit: Sie können Abonnenten isoliert testen, indem Sie ihnen gefälschte Ereignisse unterjubeln.
  • \n
  • Reaktivität: Das System reagiert selbstständig auf Änderungen, ohne Ressourcen für leere Abfragen zu verschwenden.
  • \n
\n\n

Grundlegender Mechanismus: Delegaten und Ereignisse in C#

\n

Bevor wir die Architektur aufbauen, lassen Sie uns die Grundlagen verstehen. In C# ist ein Ereignis einfach ein spezialisierter Delegat mit dem Modifikator event. Ein Delegat ist ein Typ, der einen Verweis auf eine Methode (oder mehrere Methoden) speichert.

\n\n

Unser ersten Event-Driven-Code schreiben

\n

Stellen Sie sich vor, wir schreiben ein Smart-Home-System. Ein Bewegungssensor sendet ein Signal, wenn jemand hereinkommt.

\n\n
public class MotionSensor\n{\n    // 1. Delegat deklarieren (Ereignistyp)\n    public delegate void MotionDetectedHandler(object sender, MotionEventArgs e);\n    \n    // 2. Ereignis deklarieren\n    public event MotionDetectedHandler OnMotionDetected;\n\n    public void Detect(string location)\n    {\n        Console.WriteLine($"[Sensor] Bewegung in {location}!");\n        \n        // 3. Ereignis auslösen (nur wenn es Abonnenten gibt)\n        OnMotionDetected?.Invoke(this, new MotionEventArgs(location));\n    }\n}\n\npublic class MotionEventArgs : EventArgs\n{\n    public string Location { get; }\n    public DateTime Timestamp { get; } = DateTime.UtcNow;\n\n    public MotionEventArgs(string location)\n    {\n        Location = location;\n    }\n}\n\n// Abonnent – eine Lampe\npublic class SmartLight\n{\n    public void OnMotion(object sender, MotionEventArgs e)\n    {\n        if (e.Location == "Wohnzimmer")\n            Console.WriteLine($"[Lampe] Schalte Licht in {e.Location} ein!");\n        else\n            Console.WriteLine($"[Lampe] Ignoriere {e.Location}.");\n    }\n}\n\n// Verwendung\nvar sensor = new MotionSensor();\nvar light = new SmartLight();\n\n// Lampe auf das Sensor-Ereignis abonnieren\nsensor.OnMotionDetected += light.OnMotion;\n\nsensor.Detect("Wohnzimmer"); // Lampe wird ausgelöst\nsensor.Detect("Küche");    // "Ignoriere Küche."
\n\n

Wichtig: Die Verwendung von ?.Invoke ist eine threadsichere Methode zum Auslösen eines Ereignisses. Ohne die null-Prüfung riskieren Sie eine NullReferenceException, wenn es keine Abonnenten gibt.

\n\n

Fortgeschrittene Ebene: EventBus und lose Kopplung

\n

Direkte Abonnements sind gut für

Blogs

Buchempfehlungen