C# (.NET) Application Configuration: Complete Guide to the Microsoft.Extensions.Configuration Library
Modern C# and .NET applications require flexible settings management: database connection strings, external service URLs, logging parameters, etc. The Microsoft.Extensions.Configuration library provides a powerful and unified mechanism for working with configuration. It supports multiple data sources (JSON, XML, environment variables, command-line arguments) and allows combining them into a single hierarchy.
Key Features of the Library
- Multi-level merging — settings from different sources are combined into a single object.
- Source priority — the last added source overrides previous ones.
- Binding to classes (Options pattern) — automatic population of POCO objects from configuration.
- Dynamic updates — support for re-reading files without restarting the application.
- Security — sensitive data can be moved to environment variables or Azure Key Vault.
Basic Usage: Reading from appsettings.json
Create an appsettings.json file in the project root:
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft": "Warning" } }, "ConnectionStrings": { "DefaultConnection": "Server=localhost;Database=mydb;User Id=sa;Password=***;" }, "AppSettings": { "AppName": "MyApp", "MaxRetries": 3, "FeatureFlags": { "EnableNewUI": true, "EnableAnalytics": false } }}Load the configuration in code:
using Microsoft.Extensions.Configuration;
var configuration = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .Build();
// Reading simple valuesstring appName = configuration["AppSettings:AppName"];int maxRetries = int.Parse(configuration["AppSettings:MaxRetries"]);
// Reading nested sectionsvar loggingSection = configuration.GetSection("Logging:LogLevel");string defaultLevel = loggingSection["Default"];
// Reading a connection stringstring connString = configuration.GetConnectionString("DefaultConnection");
Console.WriteLine($"Application: {appName}, Retries: {maxRetries}");Source Priority and Merging
You can combine multiple sources. For example, first load JSON, then override individual parameters via environment variables:
var config = new ConfigurationBuilder() .AddJsonFile("appsettings.json") .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) // for Development/Production .AddEnvironmentVariables() // environment variables have higher priority .AddCommandLine(args) // command-line arguments have the highest priority .Build();Binding to Strongly Typed Classes (Options Pattern)
Create a class for the configuration section:
public class AppSettings{ public string AppName { get; set; } public int MaxRetries { get; set; } public FeatureFlags FeatureFlags { get; set; }}
public class FeatureFlags{ public bool EnableNewUI { get; set; } public bool EnableAnalytics { get; set; }}Then bind it in Program.cs using the DI container:
// Registering servicesbuilder.Services.Configure<AppSettings>( builder.Configuration.GetSection("AppSettings"));
// Usage in a class (e.g., in a controller)public class HomeController : Controller{ private readonly AppSettings _settings; public HomeController(IOpti