gpt4 book ai didi

c# - 如何稍后在运行时配置选项?

转载 作者:行者123 更新时间:2023-12-03 23:00:24 24 4
gpt4 key购买 nike

我有一个 .Net 5 Web Api 项目,想用一些逻辑配置选项。这就是为什么我想将配置从 Startup.ConfigureServices 方法中移出并将它们放入它们自己的服务配置器(在启动期间运行)。所以我想到了这个

class OptionsConfigurator : IHostedService
{
private readonly IServiceCollection _serviceCollection;

public StartupOptionsConfigurator(IServiceCollection serviceCollection)
{
_serviceCollection = serviceCollection;
}

public Task StartAsync(CancellationToken cancellationToken)
{
/*

Build the ServiceProvider from the _serviceCollection
Get the IConfiguration service from the ServiceProvider
Read the configurationSection from the IConfiguration
call _serviceCollection.Configure<MyOptions>(configurationSection);

*/

return Task.CompletedTask;
}

public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;
}

这行不通,因为我无法将 IServiceCollection 注入(inject)构造函数。有没有一种方法可以在不需要 IServiceCollection 实例的情况下配置这些选项?

我可以提供另一个例子来说明这个问题:

您的 Api 提供单个端点来更新特定配置以在运行时更改它(可能由于某些原因更改数据库连接字符串)。

  • 创建一个新的 Web Api 项目
  • 创建一个选项类

.

public class MyOptions
{
public string Text { get; set; }
}
  • 创建 Controller

.

[ApiController]
[Route("[controller]")]
public class MyController : ControllerBase
{
private readonly IOptionsMonitor<MyOptions> _myOptionsMonitor;
private readonly IServiceCollection _serviceCollection;

public MyController(IOptionsMonitor<MyOptions> myOptionsMonitor, IServiceCollection serviceCollection)
{
_myOptionsMonitor = myOptionsMonitor;
_serviceCollection = serviceCollection;
}

[HttpPatch]
public IActionResult UpdateOptions([FromBody] string text)
{
Console.WriteLine("Before: " + JsonSerializer.Serialize(_myOptionsMonitor.CurrentValue));

_serviceCollection.Configure<MyOptions>(x => { x.Text = text; });

string newConfig = JsonSerializer.Serialize(_myOptionsMonitor.CurrentValue);
Console.WriteLine("After: " + newConfig);

return Ok(newConfig);
}
}

在请求正文中使用新的配置字符串调用补丁端点。正如预期的那样,这也不起作用,IServiceCollection 的注入(inject)是不可能的,并且会抛出异常。

有没有关于后面如何配置选项的解决方案?

最佳答案

使用 IServiceCollection.Configure 重新配置选项初始化后不可能,因为 BuildServiceProvider已经被调用了。您不能在程序初始化之外配置或添加任何服务。

要更改配置值,您只需更新 appsettings.json文件在 UpdateOptions行动和使用IOptionsMonitor无处不在。

配置配置时,您可以指定在配置文件更改时重新加载。在 Program.CreateHostBuilder :

public static IHostBuilder CreateHostBuilder(string[] args)
{
return Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.ConfigureAppConfiguration((hostingConext, configurationBuilder) =>
{
configurationBuilder.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
configurationBuilder.AddJsonFile($"appsettings.{hostingConext.HostingEnvironment.EnvironmentName}.json", optional: false, reloadOnChange: true);
configurationBuilder.AddUserSecrets(Assembly.GetExecutingAssembly(), true, true);
});
}

这样IOptionsMonitor<TOptions>.CurrentValue将始终返回存储在配置文件中的值,即使它发生变化。

关于c# - 如何稍后在运行时配置选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66301097/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com