Конфигурация приложений C# (.NET): библиотеки и подходы

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Конфигурация приложений 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                    

Рекомендаций