Если конфигурация меняется редко, перезапуск приложения — не проблема. Но когда нужно менять, например, тарифы или флаги в реальном времени, рестарт становится дорогим решением.
IOptionsMonitor<T> позволяет получать актуальные значения сразу после изменения файла конфигурации.Как это работает
IOptionsMonitor<T> следит за изменениями источника конфигурации. При каждом обращении к CurrentValue возвращается актуальное значение. Дополнительно можно подписаться на событие изменения через OnChange:public class DynamicPricingService
{
private readonly IOptionsMonitor<PricingOptions> _options;
public DynamicPricingService(IOptionsMonitor<PricingOptions> options)
{
_options = options;
_options.OnChange(updatedOptions =>
{
Log.Information("Pricing updated: BaseRate={BaseRate}",
updatedOptions.BaseRate);
});
}
public decimal CalculatePrice(decimal distance)
{
var currentOptions = _options.CurrentValue;
return currentOptions.BaseRate + (distance * currentOptions.PerMileRate);
}
}
Каждый вызов
CalculatePrice берёт свежее значение из CurrentValue без рестарта и без ручного сброса кэша. Регистрация в Program.cs:builder.Services.AddOptions<PricingOptions>()
.BindConfiguration("Pricing", binderOptions =>
{
binderOptions.BindNonPublicProperties = false;
binderOptions.ErrorOnUnknownConfiguration = true;
})
.ValidateDataAnnotations();
ErrorOnUnknownConfiguration = true защищает от опечаток в ключах — неизвестное поле в конфиге вызовет ошибку, а не тихо проигнорируется.IOptionsMonitor против IOptionsSnapshot
IOptionsMonitor<T> — синглтон. Одно и то же значение живёт на протяжении всего времени работы приложения и обновляется при изменении файла.IOptionsSnapshot<T> — скоупед. Значение фиксируется один раз на запрос и не меняется до его завершения. Это важно там, где нужна консистентность внутри одного HTTP-запроса — чтобы один и тот же запрос не увидел разные значения конфигурации в начале и в конце обработки.Если сервис живёт в синглтоне, используйте
IOptionsMonitor. Если важна согласованность в рамках запроса, IOptionsSnapshot.📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#sharp_view