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

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

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

Начать курс

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

Конфигурация — один из ключевых аспектов разработки современных приложений на C# (.NET). Она позволяет отделить параметры работы программы от кода, делая приложение гибким, переносимым и безопасным. В этой статье мы подробно разберём библиотеку Microsoft.Extensions.Configuration — основной инструмент для управления конфигурацией в .NET Core и .NET 5/6/7/8+.

Зачем нужна конфигурация?

Вместо жёстко зашитых строк подключения, URL-адресов или ключей API, конфигурация позволяет хранить эти данные в файлах (JSON, XML, INI), переменных окружения или секретах. Это упрощает развёртывание на разных средах (dev, staging, prod) и повышает безопасность.

Основные компоненты библиотеки

  • IConfiguration — интерфейс, представляющий единое дерево настроек.
  • IConfigurationBuilder — строитель, который собирает конфигурацию из различных источников.
  • ConfigurationRoot — корневой объект, реализующий IConfiguration.
  • Source Providers — поставщики данных: JSON, XML, INI, Environment Variables, Command Line, Memory, Custom.

Установка библиотеки

Библиотека входит в состав .NET SDK, поэтому для большинства проектов дополнительная установка не требуется. Однако для работы с JSON-файлами в консольных приложениях необходимо добавить пакет:

dotnet add package Microsoft.Extensions.Configuration.Json

Базовый пример: чтение из appsettings.json

Создадим файл appsettings.json:

{
  "AppSettings": {
    "SiteName": "PythonLib",
    "Version": "1.0",
    "Logging": {
      "Level": "Information",
      "File": "logs/app.log"
    }
  }
}

Теперь прочитаем его в консольном приложении:

using Microsoft.Extensions.Configuration;

class Program
{
    static void Main()
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);

        IConfiguration config = builder.Build();

        string siteName = config["AppSettings:SiteName"];
        string logLevel = config["AppSettings:Logging:Level"];

        Console.WriteLine($"Site: {siteName}, Log Level: {logLevel}");
    }
}

Использование нескольких источников

Одно из главных преимуществ Microsoft.Extensions.Configuration — поддержка цепочек источников. Последний добавленный источник имеет наивысший приоритет. Типичная цепочка:

  1. appsettings.json — базовые настройки.
  2. appsettings.{Environment}.json — настройки для конкретной среды (Development, Production).
  3. Environment Variables — переопределение для CI/CD и Docker.
  4. Command Line Arguments — для временных переопределений при запуске.

Пример настройки цепочки:

var builder = new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
    .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", optional: true)
    .AddEnvironmentVariables()
    .AddCommandLine(args);

Работа с секциями и строго типизированная конфигурация

Для удобства можно связать секции конфигурации с POCO-классами. Определим класс:

public class AppSettings
{
    public string SiteName { get; set; }
    public string Version { get; set; }
    public LoggingSettings Logging { get; set; }
}

public class LoggingSettings
{
    public string Level { get; set; }
    public string File { get; set; }
}

Привязка через Bind():

var appSettings = new AppSettings();
config.GetSection("AppSettings").Bind(appSettings);

Console.WriteLine(appSettings.SiteName); // PythonLib

Или через внедрение зависимостей (DI) в ASP.NET Core:

builder.Services.Configure<AppSettings>(builder.Configuration.GetSection("AppSettings"));

Пользовательские провайдеры конфигурации

Вы можете создать собственный источник, например, из базы данных или REST API. Для этого реализуйте интерфейс IConfigurationSource и IConfigurationProvider:

public class DatabaseConfigurationSource : IConfigurationSource
{
    public IConfigurationProvider Build(IConfigurationBuilder builder)
    {
        return new DatabaseConfigurationProvider();
    }
}

public class DatabaseConfigurationProvider : ConfigurationProvider
{
    public override void Load()
    {
        // Загружаем данные из БД
        Data["Database:ConnectionString"]                    

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