Die Verwaltung von Konfigurationseinstellungen in .NET-Anwendungen bietet zahlreiche Möglichkeiten,
doch oft finde ich die vorhandene Dokumentation nicht optimal.
Dies macht es schwierig, die beste™ oder zumindest eine benutzerfreundliche Methode zu
identifizieren. In diesem Artikel werde ich darlegen, wie ich dieses Problem angegangen bin.
Der manuelle Weg
In zahlreichen Anleitungen, sowohl im Internet als auch auf der Microsoft-Webseite, wird erläutert,
wie man mit der Klasse
auf Konfigurationsdaten zugreifen kann, die über JSON, Umgebungsvariablen und Startargumente
bereitgestellt werden. Oftmals erfolgt das Auslesen dieser Daten manuell.
Das Problem dieser Methode ist ihre Anfälligkeit für Fehler. Einerseits wird mit
Zeichenketten hantiert, die keine Typsicherheit bieten, andererseits kann es besonders
kompliziert werden, sobald komplexere Daten als einfache Zeichenketten benötigt werden.
Komplexe Datenstrukturen
Die folgende JSON-Datei ist praxisnäher gestaltet und umfasst Elemente, die beim manuellen Parsen
Kopfschmerzen bereiten können: verschiedene Datentypen, einschließlich Enumerationen, POCOs
und Arrays.
Diese Datenstruktur in Form sähe in C# beispielsweise so aus:
Das Auslesen dieser Struktur kann äußerst mühsam sein (Pain in the Ass®). Es verdient Erwähnung,
daß in diesem Beispiel der
besonders hervorsticht, mit dem die Anwendung ohne ersichtlichen Grund den HTTP-Statuscode
zurückgibt. Dies ist eine brillante Idee, die in jeder Anwendung an irgendeiner Stelle implementiert
werden sollte.
Automatisches Mapping
Das Mapping lässt sich vereinfachen durch den Einsatz der Klasse
aus dem Paket
.
Bei diesem Vorgehen leitet man von der Klasse ab und definiert einen Lambda-Ausdruck im Konstruktor.
Dieser Delegate erhält eine Instanz der DTO-Klasse als Parameter. Da der Ausdruck im Konstruktor
spezifiziert wird, befindet sich auch eine Instanz von
im Scope. Der Methode
übergibt man den durch einen String spezifizierten (und mit :getrennten) Pfad im Konfigurationsbaum und die Instanz der Optionen-Klasse, wodurch die Werte in das Objekt geschrieben werden.
Um das Dependency Injection-System darüber zu informieren, daß diese Optionsklasse verfügbar ist,
fügt man sie zur
hinzu.
Nach diesem Schritt steht die Klasse anderen, im DI-Container registrierten, Klassen zur Verfügung.
Erweiterte Konfiguration
Da der Container zum Zeitpunkt des Setups bereits zur Verfügung steht, ist es möglich, andere Dienste
anzufordern, falls für den korrekten Aufbau der Options-Klasse spezielle Aktionen notwendig
sein sollten. Dies bietet Flexibilität und erweiterte Möglichkeiten zur Anpassung.
Im nächsten Artikel werde ich zeigen, wie man mit
auf Änderungen an der Konfiguration im Programm reagieren kann. Dies ermöglicht Echtzeit-Aktualisierungen,
die sicherstellen, dass sich die Anwendung dynamisch an Konfigurationsänderungen
anpassen kann.
Auf Konfigurations-Änderungen In .NET reagieren
IOptionsMonitorist ein leistungsstarkes Werkzeug, das es ermöglicht, Konfigurationsoptionen dynamisch zu überwachen und auf Änderungen zu reagieren.