asp.net core 将配置文件配置迁移到数据库(一)
2019-03-07 16:32
656 查看
asp.net core 将配置文件配置迁移到数据库(一)
Intro
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<ConfigurationsDbContext> _dbContextOptions; public EntityFrameworkConfigurationProvider(DbContextOptions<ConfigurationsDbContext> 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<DbContextOptionsBuilder<ConfigurationsDbContext>> _action; public EntityFrameworkConfigurationSource(Action<DbContextOptionsBuilder<ConfigurationsDbContext>> action) { _action = action; } private readonly DbContextOptionsBuilder<ConfigurationsDbContext> DbContextOptionsBuilder = new DbContextOptionsBuilder<ConfigurationsDbContext>(); 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 { /// <summary> /// Adds an <see cref="IConfigurationProvider"/> that reads configuration values from EntityFramework. /// </summary> /// <param name="builder">The <see cref="IConfigurationBuilder"/> to add to.</param> /// <param name="action">Configures the configurationsDbContext source.</param> /// <returns>The <see cref="IConfigurationBuilder"/>.</returns> public static IConfigurationBuilder AddEntityFramework(this IConfigurationBuilder builder, Action<DbContextOptionsBuilder<ConfigurationsDbContext>> 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<Startup>();
源码
你可以修改源码来进一步定制符合你需要的基于数据库的 ConfigurationProvider
相关文章推荐
- ASP.NET+DLL+DLL读取配置文件(DLL中访问数据库和WebService)
- ASP.NET通过配置Web.config文件提高手动绑定数据库效率的一个简单方法,不用每次手动连接数据库地址,或者数据库地址变更时只改一处即可。
- C# asp.net 配置文件连接sql 数据库
- asp.net core1.x/asp.net core2.0中如何加载多个配置文件
- ASP.NET 2.0 遍历配置文件的数据库连接字符串
- 【无私分享:ASP.NET CORE 项目实战(第八章)】读取配置文件(二) 读取自定义配置文件
- ASP.NET CORE入门之读取Json配置文件
- 一起学ASP.NET Core 2.0学习笔记(二): ef core2.0 及mysql provider 、Fluent API相关配置及迁移
- asp.net mvc开发中,web.config文件如何配置数据库链接
- 【无私分享:ASP.NET CORE 项目实战(第六章)】读取配置文件(一) appsettings.json
- 详解ASP.NET Core 在 JSON 文件中配置依赖注入
- ASP.NET Core 配置文件(无处不在的依赖注入)
- asp.net core-6.Bind读取配置文件到C#实例中
- 菜鸟入门【ASP.NET Core】5:命令行配置、Json文件配置、Bind读取配置到C#实例、在Core Mvc中使用Options
- ASP.NET Core 2.0系列学习笔记-NLog日志配置文件
- asp.net core配置文件加载过程的深入了解
- [导入]ASP.NET 2.0 遍历配置文件的数据库连接字符串
- ASP.NET连接数据库配置文件
- 【无私分享:ASP.NET CORE 项目实战(第六章)】读取配置文件(一) appsettings.json
- ASP.NET项目中的web.config文件里配置数据库连接并在程序代码中获取连接字符串