Как reloadOnChange из Microsoft.Extensions.Configuration работает для appsettings.json

В двух проектах (веб-API .NET Core и WindowsService .NET Core) я использую appsettings.json для конфигурации.

 var configuration = new ConfigurationBuilder()
           .SetBasePath(System.IO.Directory.GetCurrentDirectory())
           .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
           .AddEnvironmentVariables()
           .Build();

В обоих случаях для reloadOnChange установлено значение true, и я использую его как внедренный IOptions через инъекцию зависимостей. Внутри веб-API в классы контроллера и внутри службы в классы, которые используют настройки.

К сожалению, я заметил, что значения не меняются при изменении appsettings.json.

В веб-API я создал контроллер, который просто возвращает строковое значение из конфигурации, и оно остается таким же, как при запуске.

Итак, мои вопросы:

  1. Кто-нибудь знает, должно ли это работать из коробки (по крайней мере, в веб-API)?
  2. Что-нибудь, что я должен сделать, чтобы это работало?

person monty    schedule 11.04.2017    source источник
comment
Как вы регистрируете свои варианты? Вы используете services.Configure<MyAppSettings>(Confiugration.GetSection(...))? или вы используете .Bind()?   -  person Tseng    schedule 11.04.2017
comment
В обоих случаях services.Configure ‹MyAppSettings› (Confiugration.GetSection (.‌ ..))   -  person monty    schedule 11.04.2017
comment
Обычно это работает через токены изменения, которые регистрируются при вызове вышеуказанной перегрузки (github.com/aspnet/Options/blob/rel/1.1.0/src/) и github.com/aspnet/Options/blob/rel/1.1. 0 / src / запускает повторную привязку при активации токена   -  person Tseng    schedule 11.04.2017
comment
@Tseng не могли бы вы описать это поподробнее?   -  person Lukas Hieronimus Adler    schedule 12.01.2018
comment
@LukasHieronimusAdler, вы просто используете AddJsonFile (appsettings.json, необязательно: false, reloadOnChange: true) с reloadOnChange true. если вы используете IOptionsSnapshot в конструкторе, куда вводятся зависимости, вместо IOptions, вы всегда будете получать обновленный снимок. Уловка по-прежнему заключается в том, чтобы отслеживать создание ваших экземпляров. Некоторые службы зарегистрированы как синглтоны, поэтому параметры вводятся только один раз и не получают обновленные версии настроек (поскольку инъекция больше не выполняется). например в строках подключения DBContext ....   -  person monty    schedule 18.01.2018
comment
@monty Спасибо за вашу помощь, но я не понимаю. У меня есть IOptionsSnapshot в контроллерах, который отлично работает. Но теперь я также хотел бы использовать IOptionsSnapshot в моих обычных классах. В этом случае я не могу получить к нему доступ, потому что, если я хочу создать объект (в конструкторе я добавил IOptionsSnapshot, как в классах контроллера), мне нужно было передать ему объект из типа IOptionsSnapshot. Но я понятия не имею, где я могу это получить   -  person Lukas Hieronimus Adler    schedule 19.01.2018
comment
@LukasHieronimusAdler вы можете запросить свой IOptionsSnapshot, как и любую другую службу из ServiceProvider в Microsoft.Extensions.DependencyInjection, например например, YourCustomOptionsClass options = ServiceProvider.GetService ‹IOptionsSnapshot ‹YourCustomOptionsClass›› (). Value; Каждый раз, когда вы запрашиваете варианты, это будет самая новая версия. Если вы запросите Options ‹YourCustomOptionsClass› вместо IOptionsSnapshot, он не будет обновлен. (Насколько мне известно).   -  person monty    schedule 22.01.2018
comment
@monty, как мне получить доступ к классу ServiceProvider? Не разрешено создавать объект ServiceProvider ... Спасибо за вашу невероятно хорошую помощь :)   -  person Lukas Hieronimus Adler    schedule 22.01.2018
comment
@LukasHieronimusAdler ну, это зависит от типа проекта, который вы разрабатываете. Вы реализуете веб-проект api или ASP Net Core MVC или какой-либо другой тип?   -  person monty    schedule 22.01.2018
comment
@monty я разрабатываю в asp net core mvc   -  person Lukas Hieronimus Adler    schedule 22.01.2018
comment
@LukasHieronimusAdler В конструкторе вне контроллера вы можете определить IServiceProvider serviceProvider, и он будет внедрен. С этого момента вы можете передать ссылку на свой класс и так далее и так далее ... Пожалуйста, также помните, что я до сих пор не тестировал функцию reloadOnChange успешно для своего сценария. Я просто пытаюсь помочь вам в том, что знаю на данный момент.   -  person monty    schedule 22.01.2018


Ответы (1)


Предполагая, что вы используете .net-core 1.1 (поскольку reloadOnChange поддерживается только в ASP.NET Core 1.1 и выше), вы действительно хотите IOptionsSnapshot (см. Конфигурация в ASP.NET Core - IOptionsSnapshot), а не просто IOptions.

person Boggin    schedule 11.04.2017
comment
пока это не работает, но я буду продолжать пытаться - person monty; 14.04.2017
comment
Это сработало для меня! Я ввожу IOptions<MyAppSettings> через конструктор. Если изменить его на IOptionsSnapshot<MyAppSettings>, он будет обновляться при изменении файла без перезапуска приложения. - person Doctor Blue; 27.02.2018