Microsoft.Extensions.Configuration
Eintrag zuletzt aktualisiert am: 08.01.2020
Microsoft.Extensions.Configuration ist der Namensraum für die .NET-Klassen für den Zugriff auf Konfigurationsinformationen in
.NET Core 1.x, 2.x und 3.x sowie .NET ab Version 5.0.
Konfigurationsdateien hat der Webentwickler im alten
ASP.NET in der
XML-Datei
web.config gespeichert und mit Hilfe der Bibliothek
System.Configuration gelesen.
System.Configuration gehört zu den Bibliotheken, die in
.NET Core entfallen sind. An diese Stelle tritt nun eine Sammlung von
Nuget-Paketen unter dem Oberbegriff "Microsoft.Extensions.Configuration", mit denen der Entwickler Name-Wert-Paare aus unterschiedlichen Speicherarten lesen und kombinieren kann. Unterstützt werden z.B.
JSON-,
XML- und INI-Dateien sowie Umgebungsvariablen und Kommandozeilenparameter.
Dazu sind folgende
Nuget-Pakete verfügbar:
JSON: Microsoft.Extensions.Configuration.Json
INI: Microsoft.Extensions.Configuration.Ini
XML: Microsoft.Extensions.Configuration.Xml
Umgebungsvariablen: Microsoft.Extensions.Configuration.Environment
Variables
Kommandozeilenargumente: Microsoft.Extensions.Configuration.CommandLine
Microsoft Azure Key Vault: Microsoft.Extensions.Configuration.AzureKeyVault
Informationen können dabei verschlüsselt sein [docs.microsoft.com/en-us/aspnet/core/security/data-protection/introduction]. Listing 3 zeigt Fragmente, wie man die gleiche Information in
XML-, INI- und
JSON-Format ausdrückt. Listing 4 zeigt das Laden dieser drei
Konfigurationsdateien aus dem Ordner „Config“, relativ zum Wurzelverzeichnis der Webanwendung (wwwroot-Ordner) sowie das Hinzufügen eines Eintrags im RAM. Der Parameter „true“ bei AddIniFile() bedeutet, dass die Datei optional ist, es also keinen Laufzeitfehler („FileNotFound
Exception“) gibt, wenn sie fehlt. Im RAM geänderte oder hinzugefügte Einträge können nicht persistiert werden.
Danach kann der Entwickler über das von build() gelieferte
Objekt einzelne Einstellungen über den
Indexer des Configuration-
Objekts abrufen, z.B. configuration["Impressum:Autor"] oder über configuration.GetSection("Impressum") alle Einträge einer Sektion erhalten. Wenn, wie im Fall von Listing 3, mehrere identische Einträge in einer Sektion vorliegen, gewinnt der zuletzt hinzugefügte Eintrag. In Listing 4 kommen Autor und Version aus der
XML-Datei!
<Config>
<Impressum>
<Autor>Dr. Schwichtenberg</Autor>
<Version>1.0</Version>
…
[Impressum]
Autor=Dr. H. Schwichtenberg
Version=v1.1
…
{
"Impressum": {
"Autor": "
Dr. Holger Schwichtenberg",
"Version": "1.2",
…
Listing 3: Konfigurationsinformationen im
XML-, INI- und
JSON-Format
// mehrere
Konfigurationsdateien festlegen
var builder = new ConfigurationBuilder()
.SetBasePath(_env.WebRootPath)
.AddJsonFile(@"Config\Config.json")
.AddIniFile(@"Config\Config.ini", true)
.AddXmlFile(@"Config\Config.xml")
.AddInMemoryCollection()
.AddEnvironment
Variables();
// Gesamtliste erzeugen
IConfigurationRoot configuration = builder.Build();
// noch einen Eintrag im RAM hinzufügen
configuration["Impressum:Stand"] = DateTime.Now.ToString();
Listing 4:
Konfigurationsdateien laden und Eintrag im RAM hinzufügen
Alle Einträge einer Sektion liest man mit GetSection() und GetChildren():
IConfigurationSection section1 = configuration.GetSection("Impressum");
e += "<h3>Alle Einträge der Konfigurationssektion 'Impressum':</h3>";
foreach (var s in section1.GetChildren())
{
e += s.Key + "=" + s.Value + "<br>";
}
Wenn es in der
Konfigurationsdatei eine
Liste von Einträgen gibt, z.B.
"Versionsgeschichte": [
{
"Version": "1.0",
"Datum": "1.1.2017"
},
{
"Version": "1.1",
"Datum": "10.2.2017"
}, …
]
kann man in dem
Indexer des Configuration-
Objekts wieder einen Index (der bei 0 beginnt) verwenden, z.B. für den ersten Eintrag in „Versionsgeschichte“:
configuration["Versionsgeschichte:0:Version"];
Mit dem folgenden Programmcode listet man dann alle Versionseinträge auf:
IConfigurationSection section2 = configuration.GetSection("Versionsgeschichte");
foreach (var geschichte in section2.GetChildren())
{
foreach (var geschichtseintrag in geschichte.GetChildren())
{
e += geschichtseintrag.Key + "=" + geschichtseintrag.Value + "<br>";
}
}