Конфигурация приложений 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 — поддержка цепочек источников. Последний добавленный источник имеет наивысший приоритет. Типичная цепочка:
appsettings.json— базовые настройки.appsettings.{Environment}.json— настройки для конкретной среды (Development, Production).Environment Variables— переопределение для CI/CD и Docker.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"]