栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

asp.net core 将配置文件配置迁移到数据库(一)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

asp.net core 将配置文件配置迁移到数据库(一)

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 _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;
                }
            }
        }
    }
}
  1. 实现 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  

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/230788.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号