Источники и поставщики конфигурации
Объединяйте конфигурацию из JSON-файлов, переменных среды, аргументов командной строки и пользовательских поставщиков с учётом приоритета.
«Источники и поставщики конфигурации» — бесплатный урок C# Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 4 уроков всего.
Конфигурация в .NET
Система конфигурации ASP.NET Core считывает параметры из нескольких источников — JSON-файлов, переменных среды, аргументов командной строки и других — и объединяет их в единое плоское хранилище пар ключ-значение, доступное в любом месте вашего приложения.
appsettings.json
appsettings.json — это файл конфигурации по умолчанию. Он автоматически загружается с помощью Host.CreateApplicationBuilder. Параметры объединяются с переопределениями для конкретной среды.
// appsettings.json
{
"App": {
"Name": "OrderService",
"MaxRetries": 3
},
"ConnectionStrings": {
"Default": "Server=localhost;Database=orders"
}
}
// appsettings.Production.json overrides the above:
{
"ConnectionStrings": {
"Default": "Server=prod-db;Database=orders;..."
}
}Чтение значений конфигурации
Получайте доступ к конфигурации через IConfiguration. Для вложенных объектов используются ключи с разделителями-точками. Доступ к массивам выполняется по индексу.
// Inject IConfiguration
public class OrderService
{
private readonly IConfiguration _config;
public OrderService(IConfiguration cfg) => _config = cfg;
public void Configure()
{
string? name = _config["App:Name"]; // "OrderService"
int maxRetries = _config.GetValue<int>("App:MaxRetries"); // 3
string? connStr = _config.GetConnectionString("Default");
// Nested section
var section = _config.GetSection("App");
string? appName = section["Name"];
}
}Переменные среды
Переменные среды переопределяют параметры JSON и необходимы для развертывания в контейнерах. Двойные символы подчёркивания (__) заменяют разделители-двоеточия во вложенных ключах.
# Set via shell or docker-compose:
export App__Name="OrderService-Prod"
export App__MaxRetries=5
export ConnectionStrings__Default="Server=prod-db;..."
// Equivalent to:
{
"App": { "Name": "OrderService-Prod", "MaxRetries": 5 },
"ConnectionStrings": { "Default": "Server=prod-db;..." }
}
// Priority: env vars > appsettings.{Environment}.json > appsettings.jsonАргументы командной строки
По умолчанию аргументы командной строки имеют наивысший приоритет. Для них используется синтаксис --key=value или --key value, а для вложенности — двоеточия или двойные символы подчёркивания.
# Override config when launching the app:
dotnet run --App:Name="CLI-Override" --App:MaxRetries=10
# Or:
dotnet run --App__Name="CLI-Override"
// The builder.Configuration.AddCommandLine() is called
// automatically by Host.CreateApplicationBuilder().
// Priority order (highest to lowest):
// 1. Command-line args
// 2. Environment variables
// 3. appsettings.{ASPNETCORE_ENVIRONMENT}.json
// 4. appsettings.jsonСекреты пользователя
Секреты пользователя хранят конфиденциальную конфигурацию вне каталога проекта во время разработки. Они никогда не добавляются в систему контроля версий и локально переопределяют appsettings.json.
# Initialize user secrets for the project:
dotnet user-secrets init
# Set a secret:
dotnet user-secrets set "Database:Password" "SuperSecret123"
dotnet user-secrets set "Jwt:SecretKey" "dev-only-key"
# List secrets:
dotnet user-secrets list
# Remove:
dotnet user-secrets remove "Database:Password"
# Stored in: ~/.microsoft/usersecrets/{projectId}/secrets.json
# Automatically loaded in Development environment onlyПользовательские поставщики конфигурации
Реализуйте IConfigurationProvider и IConfigurationSource, чтобы загружать config из любого источника — базы данных, Consul, Vault, Redis и других.
public class DbConfigProvider : ConfigurationProvider
{
private readonly string _connStr;
public DbConfigProvider(string connStr) => _connStr = connStr;
public override void Load()
{
using var conn = new NpgsqlConnection(_connStr);
conn.Open();
using var cmd = new NpgsqlCommand(
"SELECT key, value FROM app_config", conn);
using var reader = cmd.ExecuteReader();
while (reader.Read())
Data[reader.GetString(0)] = reader.GetString(1);
}
}
public class DbConfigSource : IConfigurationSource
{
private readonly string _connStr;
public DbConfigSource(string connStr) => _connStr = connStr;
public IConfigurationProvider Build(IConfigurationBuilder b)
=> new DbConfigProvider(_connStr);
}Регистрация пользовательского поставщика
Добавьте пользовательский источник конфигурации в построитель до вызова Build(). Он включается в ту же цепочку приоритетов, что и встроенные поставщики.
var builder = Host.CreateApplicationBuilder(args);
// Add custom DB config provider after appsettings.json
builder.Configuration.Add(
new DbConfigSource(
builder.Configuration.GetConnectionString("Default")!));
// Or as an extension method:
public static class ConfigExtensions
{
public static IConfigurationBuilder AddDatabaseConfig(
this IConfigurationBuilder b, string connStr)
=> b.Add(new DbConfigSource(connStr));
}
// Usage:
builder.Configuration.AddDatabaseConfig(connStr);Azure App Configuration
Azure App Configuration централизует параметры микросервисов с помощью флагов функций, меток и версий. Официальный поставщик подключается как стандартный источник конфигурации.
// dotnet add package Azure.Extensions.AspNetCore.Configuration.Secrets
// dotnet add package Microsoft.Azure.AppConfiguration.AspNetCore
builder.Configuration.AddAzureAppConfiguration(options =>
options
.Connect(builder.Configuration["AzureAppConfig:ConnectionString"])
.Select(KeyFilter.Any) // all keys
.Select(KeyFilter.Any, "Production") // label override
.UseFeatureFlags(ff =>
ff.CacheExpirationInterval = TimeSpan.FromMinutes(5))
.ConfigureRefresh(r =>
r.Register("App:Version", refreshAll: true)
.SetCacheExpiration(TimeSpan.FromMinutes(1)))
);
app.UseAzureAppConfiguration(); // enable dynamic refreshПерезагрузка конфигурации
Некоторые поставщики поддерживают обнаружение изменений. Поставщик JSON может перезагружать данные при изменении файла. Используйте IOptionsMonitor<T>, чтобы реагировать на изменения во время выполнения.
// Enable JSON file reload on change:
builder.Configuration.AddJsonFile("appsettings.json",
optional: false, reloadOnChange: true);
// In a service, use IOptionsMonitor (not IOptions) to get live values:
public class FeatureService
{
private readonly IOptionsMonitor<FeatureFlags> _monitor;
public FeatureService(IOptionsMonitor<FeatureFlags> m) => _monitor = m;
public bool IsBetaEnabled
=> _monitor.CurrentValue.BetaEnabled; // always fresh
// React to changes:
public FeatureService(IOptionsMonitor<FeatureFlags> m)
{
_monitor = m;
m.OnChange(flags => Console.WriteLine("Config changed!"));
}
}Быстрая проверка
Какой разделитель следует использовать, чтобы представить вложенные ключи конфигурации JSON в виде переменных среды?
Практический пример: конфигурация из нескольких источников
Конфигурация для рабочей среды, объединяющая appsettings, переменные среды и секреты пользователя с явно заданным порядком приоритетов.
var builder = Host.CreateApplicationBuilder(args);
// Default: appsettings.json → appsettings.{env}.json → env vars → CLI
// Add user secrets in development:
if (builder.Environment.IsDevelopment())
builder.Configuration.AddUserSecrets<Program>();
// Optionally add Azure Key Vault in production:
if (!builder.Environment.IsDevelopment())
{
var keyVaultUri = builder.Configuration["Azure:KeyVaultUri"]!;
builder.Configuration.AddAzureKeyVault(
new Uri(keyVaultUri), new DefaultAzureCredential());
}
// Now all secrets are available transparently via IConfiguration
var jwtKey = builder.Configuration["Jwt:SecretKey"]!;Итоги: источники и поставщики конфигурации
Основные выводы:
- Конфигурация объединяется из нескольких источников; последующие источники переопределяют предыдущие
- Приоритет: аргументы CLI > переменные среды > appsettings.{env}.json > appsettings.json
- Используйте
__(двойное подчёркивание) в переменных среды для вложенных ключей - Секреты пользователя не позволяют хранить учётные данные разработки в системе контроля версий
- Пользовательские поставщики: реализуйте
IConfigurationSource+IConfigurationProvider - Используйте
reloadOnChange: true+IOptionsMonitorдля обновления конфигурации в реальном времени
Часто задаваемые вопросы
Урок «Источники и поставщики конфигурации» бесплатный?
Да — полный текст урока «Источники и поставщики конфигурации» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 4 уроков всего.
Чему я научусь в уроке «Источники и поставщики конфигурации»?
Объединяйте конфигурацию из JSON-файлов, переменных среды, аргументов командной строки и пользовательских поставщиков с учётом приоритета. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C# Academy?
Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Источники и поставщики конфигурации»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C# Academy?
Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Источники и поставщики конфигурации
- Строго типизированные параметры с IOptions
- Проверка параметров и именованные параметры
- Управление секретами