Где хранятся глобальные настройки приложения
Что проверяют
Знаете ли вы, как устроена конфигурация в современном .NET: откуда берутся значения, кто кого перекрывает и где держать секреты. Следом обычно спрашивают, как подхватить изменения без перезапуска и чем отличаются IOptions, IOptionsSnapshot и IOptionsMonitor.
Как отвечать
В ASP.NET Core и Generic Host настройки собираются из нескольких провайдеров в одно дерево IConfiguration. Порядок по умолчанию, каждый следующий перекрывает предыдущий:
appsettings.json: общие несекретные настройки;appsettings.{Environment}.json: переопределения под окружение изASPNETCORE_ENVIRONMENTилиDOTNET_ENVIRONMENT;- user secrets: только в Development, лежат в профиле пользователя вне репозитория, задаются через
dotnet user-secrets set. Это не шифрование, а способ не коммитить пароли; - переменные окружения: вложенность через двойное подчёркивание,
ConnectionStrings__Default; - аргументы командной строки: высший приоритет.
Секреты в проде живут в хранилище: Azure Key Vault, HashiCorp Vault, Yandex Lockbox, секреты Kubernetes, которые попадают в под переменными или файлами.
В коде настройки читают через Options pattern: AddOptions<SmtpOptions>().Bind(...).ValidateDataAnnotations().ValidateOnStart(). IOptions<T> читается один раз, IOptionsSnapshot<T> пересчитывается на каждый запрос (scoped), IOptionsMonitor<T> это singleton с событием OnChange. JSON-файлы по умолчанию подключены с reloadOnChange: true.
Настройки, которые администратор меняет на лету, выносят в базу или сервис фиче-флагов. В старом .NET Framework ответ другой: App.config или Web.config и ConfigurationManager.AppSettings.
Где спотыкаются
Кладут строки подключения с паролями в appsettings.json и коммитят. «Зашифруем файл» не спасает, ключ всё равно окажется рядом.
Внедряют IOptionsSnapshot<T> в singleton-сервис. Это scoped-зависимость, и в Development контейнер выбросит исключение. Для singleton нужен IOptionsMonitor<T>.
Разбрасывают configuration["Smtp:Host"] по всему коду. Опечатка в ключе даёт null в рантайме, а не ошибку при старте, как с валидацией опций.