Конфигурация

Тема дорожной карты · .NET / C# Developer

Система конфигурации в ASP.NET Core — это слой абстракции над разными источниками настроек: JSON-файлы (appsettings.json), переменные окружения, аргументы командной строки, Azure Key Vault, секреты пользователя, базы данных. Все источники сливаются в один IConfiguration, доступный по DI. Подход унифицирован: написал код один раз, а оператор переключает источники для dev/stage/prod без изменения приложения.

Как это работает

WebApplicationBuilder по умолчанию подключает несколько провайдеров в строгом порядке: appsettings.jsonappsettings.{Environment}.json → User Secrets (в Development) → переменные окружения → командная строка. Более поздние источники переопределяют ранние. Доступ к значениям — через IConfiguration["Key"] для строк или Get<T>() для типизированных объектов. Идиоматичный паттерн — IOptions<T> через DI: класс настроек регистрируется в Services.Configure<MySettings>(builder.Configuration.GetSection("MySettings")), после чего внедряется в любые сервисы. Поддерживается reload-on-change для JSON: IOptionsMonitor<T> подписывается на изменения без перезапуска.

Когда применять

Используйте IConfiguration или IOptions<T> всегда — даже для одной строки подключения. Это создаёт инфраструктуру для будущих изменений без рефакторинга. Для значений, меняющихся в рантайме (feature flags, лимиты), берите IOptionsMonitor<T>. Для значений из БД или внешних API используйте кастомный provider — он включится в общий стек как ещё один источник. Иерархические ключи (Logging:LogLevel:Default) поддерживаются всеми provider-ами одинаково, включая переменные окружения (двойное подчёркивание Logging__LogLevel__Default в Linux) — это упрощает деплой в контейнеры. Для production-сетапа стандартный паттерн: чувствительные значения в Key Vault или K8s Secrets, остальное в appsettings.{Environment}.json, локальные оверрайды через User Secrets в dev.

Типичные ошибки

Хардкод секретов в appsettings.json — секреты должны быть в Key Vault или переменных окружения, никогда не в git. Использование IOptions<T> для меняющихся значений (внутри singleton-а кешируется навсегда) — нужен IOptionsMonitor<T>. Игнорирование валидации опций — добавляйте .ValidateDataAnnotations() или ручной IValidateOptions<T>. Зависимость от IConfiguration напрямую в бизнес-логике вместо типизированных options делает код хрупким.

Связанные понятия

Полезные ресурсы