我可以在 ASP.NET Core MVC 应用程序中将配置从 appsettings.json 移动到数据库吗?

Ele*_*lin 14 database asp.net-mvc configuration-files appsettings asp.net-core-2.1

我有这个应用程序,它使用 来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();
}
Run Code Online (Sandbox Code Playgroud)

我想知道是否有可行的或可能的类似的事情:

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();
}
Run Code Online (Sandbox Code Playgroud)

是否可以?或者我正在尝试重新发明轮子?

预先感谢您的宝贵时间!

art*_*ras 17

首先,您为数据库创建一个实体。

public class SettingsEntity
{
    public Guid Id { get; set; }
    public string Key { get; set; }
    public string Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

其次是配置源。

public class DatabaseConfigurationSource : IConfigurationSource
{
    public DatabaseConfigurationSource(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public IConfigurationProvider Build(IConfigurationBuilder builder)
    {
        return new DatabaseConfigurationProvider(Configuration);
    }
}
Run Code Online (Sandbox Code Playgroud)

第三个配置提供者。

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;
    }
Run Code Online (Sandbox Code Playgroud)

第四,延长注册时间。

public static class DatabaseConfigurationBuilderExtensions
{
    public static IConfigurationBuilder AddDatabaseConfiguration(
        this IConfigurationBuilder builder)
    {
        var tempConfig = builder.Build();
        return builder.Add(new DatabaseConfigurationSource(tempConfig));
    }
}
Run Code Online (Sandbox Code Playgroud)

最后在 Program.cs 中注册它

 public static IWebHostBuilder CreateHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .ConfigureAppConfiguration((hostingContext, config) =>
        {
            config.AddDatabaseConfiguration();
        })
        .UseNLog();
Run Code Online (Sandbox Code Playgroud)