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.EnvironmentVariables
 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 („FileNotFoundException“) 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()
.AddEnvironmentVariables();

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