Конфигурация приложений C# (.NET): Полное руководство по библиотеке Microsoft.Extensions.Configuration
Современные приложения на C# и .NET требуют гибкого управления настройками: строки подключения к БД, URL внешних сервисов, параметры логирования и т.д. Библиотека Microsoft.Extensions.Configuration предоставляет мощный и унифицированный механизм для работы с конфигурацией. Она поддерживает множество источников данных (JSON, XML, переменные окружения, аргументы командной строки) и позволяет комбинировать их в одной иерархии.
Основные возможности библиотеки
- Многоуровневое слияние — настройки из разных источников объединяются в единый объект.
- Приоритет источников — последний добавленный источник переопределяет предыдущие.
- Привязка к классам (Options pattern) — автоматическое заполнение POCO-объектов из конфигурации.
- Динамическое обновление — поддержка перечитывания файлов без перезапуска приложения.
- Безопасность — чувствительные данные можно выносить в переменные окружения или Azure Key Vault.
Базовое использование: чтение из appsettings.json
Создайте файл appsettings.json в корне проекта:
{
"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
}
}
}
Загрузите конфигурацию в коде:
using Microsoft.Extensions.Configuration;
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.Build();
// Чтение простых значений
string appName = configuration["AppSettings:AppName"];
int maxRetries = int.Parse(configuration["AppSettings:MaxRetries"]);
// Чтение вложенных секций
var loggingSection = configuration.GetSection("Logging:LogLevel");
string defaultLevel = loggingSection["Default"];
// Чтение строки подключения
string connString = configuration.GetConnectionString("DefaultConnection");
Console.WriteLine($"Приложение: {appName}, Retries: {maxRetries}");
Приоритет и слияние источников
Вы можете комбинировать несколько источников. Например, сначала загрузить JSON, затем переопределить отдельные параметры через переменные окружения:
var config = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) // для Development/Production
.AddEnvironmentVariables() // переменные окружения имеют высший приоритет
.AddCommandLine(args) // аргументы командной строки — наивысший приоритет
.Build();
Привязка к строго типизированным классам (Options Pattern)
Создайте класс для секции конфигурации:
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; }
}
Затем привяжите его в Program.cs с помощью DI-контейнера:
// Регистрация сервисов
builder.Services.Configure<AppSettings>(
builder.Configuration.GetSection("AppSettings"));
// Использование в классе (например, в контроллере)
public class HomeController : Controller
{
private readonly AppSettings _settings;
public HomeController(IOptions<AppSettings> options)
{
_settings = options.Value;
}
public IActionResult Index()
{
ViewBag.AppName = _settings.AppName;
ViewBag.EnableNewUI = _settings.FeatureFlags.EnableNewUI;
return View();
}
}
Динамическое обновление конфигурации
Благодаря reloadOnChange: true (в AddJsonFile) и использованию IOptionsSnapshot<T> или IOptionsMonitor<T>, приложение автоматически подхватывает изменения в файле без перезапуска:
public class WorkerService : BackgroundService
{
private readonly IOptionsMonitor<AppSettings> _settings;
public WorkerService(IOptionsMonitor<AppSettings> settings)
{
_settings = settings;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
var current = _settings.CurrentValue;
Console.WriteLine($"AppName: {current.AppName}");
await Task