我有这个应用程序使用appsettings.json
存储一些配置,如 API 地址、令牌、保存文件的路径等。
我们没有 DevOps,因此对于我们在应用程序设置中所做的每项更改,我们需要要求基础架构团队将更改部署到生产中。
也就是说,我在想是否可以将一些配置放入数据库和Startup
构造函数或在ConfigureServices
从数据库获取此信息并在应用程序中使用它。
例如,每次我向应用程序设置添加新密钥时,都不需要进行新的部署。我只需在数据库中创建一条新记录,应用程序将使用此配置,就像它在应用程序设置中一样。
今天我们有这个:
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
}
我想知道是否存在可行的或可能的类似的事情:
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.GetConfigFromDataBase() /// And this will be the method to get from DB the dynamic configuration
.AddEnvironmentVariables();
Configuration = builder.Build();
}
是否可以?或者我正在尝试重新发明轮子?
预先感谢您的宝贵时间!
首先,您为数据库创建一个实体。
public class SettingsEntity
{
public Guid Id { get; set; }
public string Key { get; set; }
public string Value { get; set; }
}
其次是配置源。
public class DatabaseConfigurationSource : IConfigurationSource
{
public DatabaseConfigurationSource(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public IConfigurationProvider Build(IConfigurationBuilder builder)
{
return new DatabaseConfigurationProvider(Configuration);
}
}
第三个配置提供者。
public class DatabaseConfigurationProvider : ConfigurationProvider
{
public DatabaseConfigurationProvider(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public override void Load()
{
using var context = new DbContext(CreateContextOptions());
Data = context.Settings
.ToDictionary(x => x.Key, x => x.Value);
}
private DbContextOptions<DbContext> CreateContextOptions()
{
var connectionString = Configuration.GetConnectionString("Database");
return new DbContextOptionsBuilder<DbContext>()
.UseSqlServer(connectionString)
.Options;
}
第四,延长注册时间。
public static class DatabaseConfigurationBuilderExtensions
{
public static IConfigurationBuilder AddDatabaseConfiguration(
this IConfigurationBuilder builder)
{
var tempConfig = builder.Build();
return builder.Add(new DatabaseConfigurationSource(tempConfig));
}
}
最后在 Program.cs 中注册它
public static IWebHostBuilder CreateHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.AddDatabaseConfiguration();
})
.UseNLog();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)