asp.net core 配置默认是项目根目录下的 appsettings.json 文件,还有环境变量以及 command line arguments,有一些链接字符串等信息可能放在数据库里更好一些,也方便修改与维护,有的配置可能多个应用共享一些配置,这样维护在数据库里可能就只需要配置一次。有人可能说那你为什么不直接搞个配置中心呢,开始是想直接接入一个配置中心,后来觉得项目不大可以不必引入配置中心,直接自己造个轮子从数据库读取配置就可以了,于是就想自己实现一套基于数据库的 ConfigurationProvider
探索 Configuration#Configuration 源码在 https://github.com/aspnet/Extensions/tree/master/src/Configuration
微软也提供了一些自己实现的 ConfigurationProvider
自定义基于 EF 的 ConfigurationProvider#需要实现两个接口
实现 IConfigurationProvider 接口
using System.Linq;using Microsoft.EntityframeworkCore;using Microsoft.Extensions.Configuration;namespace WeihanLi.Configuration.Entityframework{ internal class EntityframeworkConfigurationProvider : ConfigurationProvider
{ private readonly DbContextOptions _dbContextOptions; public EntityframeworkConfigurationProvider(DbContextOptions dbContextOptions) {
_dbContextOptions = dbContextOptions;
} public override void Load() { using (var dbContext = new ConfigurationsDbContext(_dbContextOptions))
{ var configurations = dbContext.Configurations.AsNoTracking()
.ToArray(); if (configurations.Length == 0) return; foreach (var configuration in configurations)
{
Data[configuration.Key] = configuration.Value;
}
}
}
}
} 实现 IConfigurationSource 接口
using System;using Microsoft.EntityframeworkCore;using Microsoft.Extensions.Configuration;namespace WeihanLi.Configuration.Entityframework{ internal class EntityframeworkConfigurationSource : IConfigurationSource
{ private readonly Action> _action; public EntityframeworkConfigurationSource(Action> action) {
_action = action;
} private readonly DbContextOptionsBuilder DbContextOptionsBuilder = new DbContextOptionsBuilder(); public IConfigurationProvider Build(IConfigurationBuilder builder) {
_action.Invoke(DbContextOptionsBuilder); return new EntityframeworkConfigurationProvider(DbContextOptionsBuilder.Options);
}
}
} 扩展方法:
using System;using Microsoft.EntityframeworkCore;using Microsoft.Extensions.Configuration;namespace WeihanLi.Configuration.Entityframework{ public static class RedisConfigurationExtension
{ ///
/// Adds an that reads configuration values from Entityframework.
///
/// The to add to.
/// Configures the configurationsDbContext source.
/// The .
public static IConfigurationBuilder AddEntityframework(this IConfigurationBuilder builder, Action> action) => builder.Add(new EntityframeworkConfigurationSource(action));
}
} 更多源码参考:https://github.com/WeihanLi/AspNetCorePlayground/tree/master/WeihanLi.Configuration.Entityframework
使用#修改 Program 文件 WebHost 的构建,参考https://github.com/WeihanLi/AspNetCorePlayground/blob/master/TestWebApplication/Program.cs:
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration(configBuilder =>
{ var configuration = configBuilder.Build();
configBuilder.AddEntityframework(config => config.UseSqlServer(configuration.GetConnectionString("Configurations"));
})
.UseStartup(); 源码#你可以修改源码来进一步定制符合你需要的基于数据库的 ConfigurationProvider
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
作者:posted
原文出处:https://www.cnblogs.com/weihanli/p/migrate-your-configuration-to-database.html



