gpt4 book ai didi

runtime - 每次在 .NET core 1.1 控制台应用程序中更改时,如何在运行时重新加载 appsettings.json?

转载 作者:行者123 更新时间:2023-12-01 22:27:48 27 4
gpt4 key购买 nike

我尝试重现 this great article by Andrew Lock 中描述的方法。但是,我无法在 .NET core 1.1 控制台应用程序中运行它。更改并保存 appsettings.json 文件后,如果不重新启动应用程序,则更改不会反射(reflect)在应用程序中。

涉及多个文件,因此我创建了我能想到的最小示例 on github 。我还在 github 上的 README.MD 文件中提供了详细信息。

任何解决此问题的帮助将不胜感激。请记住,我是 .NET core 的新手,而且不是经验丰富的开发人员。这是我在 stackoverflow 上的第一个问题...提前致谢!

最佳答案

要理解的关键是范围

ASP.NET Core 中存在三种作用域: transient 作用域、作用域作用域和单例作用域。 IOptionsSnapshot 配置为范围服务。

在 ASP.NET Core 中,每个请求都会启动一个作用域,因此每个请求都会获得一个新的 IOptionsSnapshot 实例,其中包含更新的配置值。

在您提供的示例中,您正在创建一个 IServiceProvider,并直接从顶级提供程序获取 IMyService 的实例:

IServiceCollection services = new ServiceCollection();
Startup startup = new Startup();
startup.ConfigureServices(services);
IServiceProvider serviceProvider = services.BuildServiceProvider();


while (true)
{
var service = serviceProvider.GetService<IMyService>();
var reply = service.DoSomething();

Console.WriteLine(reply);
}

本质上,您始终对服务提供商的每个请求使用相同的作用域,因此您始终会获得相同的 IOptionsSnapshot 实例。实际上,如果您从不创建新范围,则所有范围内的服务都会变成单例!

解决此问题的方法是在每次获取服务时创建一个新范围:

IServiceCollection services = new ServiceCollection();
Startup startup = new Startup();
startup.ConfigureServices(services);
IServiceProvider serviceProvider = services.BuildServiceProvider();


while (true)
{
using (var scope = serviceProvider.CreateScope())
{
var service = scope.ServiceProvider.GetService<IMyService>();
var reply = service.DoSomething();

Console.WriteLine(reply);
}
}

如果您要在 ASP.NET Core 应用(或控制台应用)中的请求上下文之外创建 EF Core DbContext 等操作,这一点也变得很重要。在访问服务提供商的服务之前始终创建一个新范围!

附注我已经创建了一个拉取请求来修复您的示例:)

关于runtime - 每次在 .NET core 1.1 控制台应用程序中更改时,如何在运行时重新加载 appsettings.json?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45064140/

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