Используйте IOptionsMonitor в службе Singleton для перезагрузки значений из настроек приложения во время выполнения - PullRequest
0 голосов
/ 07 февраля 2019

В настоящее время я работаю над приложением ASP.NET Core 2.2 / .NET Framework 4.7.2 ( Мне пришлось установить .NET Core 2.2 в качестве платформы в моем приложении .NET Framework 4.7.2 ).Мне нужно извлечь значения из моего файла appsettings.json (значения могут измениться в время выполнения путем изменения файла appsettings.json вручную) в одноэлементной службе.Это отлично работает.Однако требуемый reloadOnChange не работает.

Когда я изменяю значение в файле appsettings.json во время выполнения, а затем запускаю новый запрос к моей служебной логике, новые значения не извлекаются.Я уже пытался внедрить свой одноэлементный сервис как ограниченный, к сожалению, напрасно - тот же результат, без обновленной конфигурации.

Я действительно не знаю, почему обновленные значения из appsettings.json никогда не появляются в моем классе обслуживания навремя выполнения.

Мой метод CreateWebHostBuilder выглядит следующим образом:

public IWebHostBuilder CreateWebHostBuilder()
{
    var config = new ConfigurationBuilder()
       .SetBasePath(Directory.GetCurrentDirectory())
       .AddJsonFile(configFilePath, optional: false, reloadOnChange: true)
       .Build();

       return WebHost.CreateDefaultBuilder()
            .UseStartup<Startup>()
            .UseConfiguration(config);
 }

Мой класс Startup выглядит следующим образом:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public static IConfiguration Configuration { get; private set; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<AppSettings>(Configuration);

        services.AddSingleton<IFruitService, FruitService>();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    { }
}

Мой FruitService выглядит следующим образомэто:

public class FruitService : IFruitService
{
    private readonly IOptionsSnapshot<AppSettings> appSettings;

    public PomService(IOptionsSnapshot<AppSettings> appSettings)
    {
        this.appSettings = appSettings;

    }

    public async Task<FruitMix> StartFruitMix(List<Fruit> fruits)
    {
        // here I would need the changed values from the appsettings.json,
        // but always the same, no change in any request...
        var a = appSettings.Value.Test;
        var b = appSettings.Value;
        var c = appSettings.Get("");

    }
}

Мой AppSettings класс очень прост:

public class AppSettings
{
    public string Test { get; set; }
}

Мой appsettings.json выглядит так:

{
  "test": "1234" // during runtime when I manually change 1234 to sadf or 567 nothing happens in my service class on a new request (nor in singleton neither in scoped mode... I cannot retrieve the new value in my service class.)
}

Знаете ли вы, какполучить измененные значения в классе FruitService?

Большое спасибо

1 Ответ

0 голосов
/ 07 февраля 2019

Параметры, даже с включенной перезагрузкой, не меняются в течение срока действия запроса.Однако, похоже, что вы фактически сделали новый запрос и обнаружили, что параметры все еще не изменились.

Лично я не сталкивался со сценарием, в котором мне нужно было специально использовать IOptionsMonitor<TOptions>.Тем не менее, я знаю, что он внутренне использует кеш и имеет возможность вручную аннулировать опции в указанном кеше.Вполне возможно, что он фактически не перезагружается автоматически при изменении - не уверен в этом.

В любом случае, вместо этого более типично использовать IOptionsSnapshot<TOptions>.Он существует исключительно для перезагрузки опций по запросу, поэтому он, кажется, отвечает вашим потребностям здесь.Единственное преимущество IOptionsMonitor<TOptions>, похоже, заключается в его способности реально отслеживать изменения и уведомлять об обратном вызове.Опять же, я не использовал это достаточно, чтобы сказать, если вы просто делаете что-то не так, но я не думаю, что вам на самом деле это нужно в любом случае.

...