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

需要实现两个接口

  1. 实现 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;
}
}
}
}
}
  1. 实现 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/WeihanLi.Configuration.EntityFramework

使用

修改 Program 文件 WebHost 的构建,参考https://github.com/WeihanLi/AspNetCorePlayground/blob/ecb461f209db7cf73d8285806473519301f76444/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 core 将配置文件配置迁移到数据库(一)的更多相关文章

  1. C#实现多级子目录Zip压缩解压实例 NET4.6下的UTC时间转换 [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 .NET Core开发日志

    C#实现多级子目录Zip压缩解压实例 参考 https://blog.csdn.net/lki_suidongdong/article/details/20942977 重点: 实现多级子目录的压缩, ...

  2. ASP.NET Core开发-如何配置Kestrel 网址Urls

    ASP.NET Core中如何配置Kestrel Urls呢,大家可能都知道使用UseUrls() 方法来配置. 今天给介绍全面的ASP.NET Core 配置 Urls,使用多种方式配置Urls. ...

  3. asp.net core 系列 10 配置configuration (上)

    一.  ASP.NET Core 中的配置概述 ASP.NET Core 中的应用配置是基于键值对,由configuration 程序提供. configuration  将从各种配置源提供程序操作键 ...

  4. (11)ASP.NET Core 中的配置一(Configuration)

    1.前言 ASP.NET Core在应用程序上引入Microsoft.Extensions.Configuration配置,可以支持多种方式配置,包括命令行配置.环境变量配置.文件配置.内存配置,自定 ...

  5. (12)ASP.NET Core 中的配置二(Configuration)

    1.内存配置 MemoryConfigurationProvider使用内存中集合作为配置键值对.若要激活内存中集合配置,请在ConfigurationBuilder的实例上调用AddInMemory ...

  6. 翻译 - ASP.NET Core 基本知识 - 配置(Configuration)

    翻译自 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-5.0 ASP ...

  7. ASP.NET Core macOS 环境配置 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core macOS 环境配置 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 是对 ASP.NET 有重大意义的一次重新设计.本章节我 ...

  8. ASP.NET Core Windows 环境配置 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core Windows 环境配置 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Windows 环境配置 ASP.NET Core ...

  9. ASP.NET Core Windows 环境配置

    ASP.NET Core 是对 ASP.NET 有重大意义的一次重新设计.本章节我们将介绍 ASP.NET Core 中的一些新的概念和它们是如何帮助我们开发现代化的 Web 应用程序 尽管 ASP. ...

随机推荐

  1. 0516js综合练习

    <!DOCTYPE html><html>    <head>        <meta charset="UTF-8">      ...

  2. Jenkins配置报告与邮件插件

    用jenkins做持续集成时,需要发送报告与邮件,下面说一下如何配置报告与邮件的插件 1:配置报告插件 我们先装一个Report插件,在系统管理-管理插件中找  HTML Publisher plug ...

  3. capwap学习笔记——初识capwap(一)(转)

    初识CAPWAP 2.1 CAPWAP简介 CAPWAP——Control And Provisioning of Wireless Access Points Protocol Specificat ...

  4. Tiny4412之重力感应器驱动

    一:Tiny4412 裸板重力感应驱动编写 整个编写过程大概分为如下几步: (1)在底板上找到重力感应器的所在位置,找到芯片型号(我用的板子上重力感应器芯片型号为:MMA7660FC) (2)通过型号 ...

  5. Oracle-12:伪列rowid和rownum

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 伪列:不真实存储在真表中,但是我们可以查询到不能对伪列进行增删改操作! 分页可以用rownum来分!!!!!! ...

  6. 在Python中用Request库模拟登录(一):字幕库(无加密,无验证码)

    字幕库的登录表单如下所示,其中省去了无关紧要的内容: <form class="login-form" action="/User/login.html" ...

  7. mysql left join 左连接查询关联n多张表

    left join 左连接即以左表为基准,显示坐标所有的行,右表与左表关联的数据会显示,不关联的则不显示.关键字为left join on. **基本用法如下: select table a left ...

  8. SVN汉化教程2017.10.6

    https://jingyan.baidu.com/album/b87fe19e95f5925219356853.html?picindex=4

  9. (1)Ubuntu下CloudCompare的编译

    Ubuntu下,需要提前安装openGL和Qt 为了可视化操作,使用Cmake进行编译设置 将下载的CloudCompare文件夹下的cmakeList.txt用cmake作为打开方式 Cmake设置 ...

  10. 【莫比乌斯反演】BZOJ2005 [NOI2010]能量采集

    Description 求sigma gcd(x,y)*2-1,1<=x<=n, 1<=y<=m.n, m<=1e5. Solution f(n)为gcd正好是n的(x, ...