【发布时间】:2019-11-05 15:11:33
【问题描述】:
在我的 .net core mvc (2.2) 应用程序中,我有一个从数据库配置的配置。如何从控制器重新加载配置,例如在更改数据库中的某些值之后?我已经尝试过这样的事情,但它不起作用:
MyConfiguration.cs:
public class MyConfiguration
{
public string SmtpServer {get;set;}
}
Startup.cs:
public class Startup
{
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.Configure<MyConfiguration>(options => {
options.SmtpServer = Configuration["SmtpServer"];
});
// ...
services.AddSingleton<IConfiguration>(Configuration);
}
}
Program.cs:
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost
.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.SetBasePath(Directory.GetCurrentDirectory());
config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
config.AddEFConfiguration(options => options.UseNpgsql("connection_string"));
config.AddCommandLine(args);
})
.UseStartup<Startup>();
}
控制器:
public class TestController : ControllerBase
{
private readonly IConfigurationRoot _configurationRoot;
public TestController(IConfiguration configurationRoot)
{
_configurationRoot = (IConfigurationRoot)configurationRoot;
}
[HttpGet]
public async Task<IActionResult> Index()
{
// some logic for updating values in the database
// Doesn't work
_configurationRoot.Reload();
return Ok();
}
}
【问题讨论】:
-
阅读 IOptionsMonitor docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/…
-
一般来说,配置是在应用启动时设置的。某些配置提供程序支持重新加载配置的概念,结合使用
IOptionsSnapshot,您可以获得每个请求的更新值。但是,配置提供程序必须支持重新加载。数据库提供者通常不会。 -
通常,如果您的配置来自数据库,您通常应该创建一些存储库,您可以在需要时注入和使用。
标签: c# asp.net-core .net-core asp.net-core-2.2 .net-core-2.2