当前位置: 首页 > news >正文

实现.NET Core配置Provider之EF

《10分钟就能学会.NET Core配置》里详细介绍了.NET Core配置的用法另外我还开源了自定义的配置ProviderEF配置Provider和Yaml配置Provider。本文先来聊聊EF配置Provider的实现其中会涉及到EntityFramework Core的知识不熟悉也没关系且听我慢慢讲来。

配置执行流程

在使用配置的时候都是先new ConfigurationBuilder(),最后调用Build()方法赋值给Configuration属性。那我们就从这个Build方法说起。

Build方法做了什么呢它遍历了所有的配置源等等配置源哪来的还记不记得AddJsonFile,AddCommandLine这些扩展方法它们做的事情就是将配置源添加到ConfigurationBuild中。每个配置源都有一个Build方法它返回一个Provider。遍历所有配置源时调用配置源的Build方法就获得了所有配置源的Provider最后通过构造函数传给ConfigurationRoot

每个Provider里都有一个Load方法ConfigurationRoot的构造函数会遍历所有的Provider调用它的Load方法。Load方法里需要做的就是把配置源里的配置转换为IDictionary<string,string>

了解了配置执行的流程就可以动手实现自己的Provider了。

EF存储

Json配置Provider的配置存储在Json文件中基于EF的Provider的配置则是存储在数据库中因为使用了EF我们不需要关心使用的是什么数据库。

在数据库中存储配置不支持嵌套和数组只是简单的键值对形式对应数据库表中的两列。使用EF需要先定义一个实体存储配置它包含两个属性对应数据库表中的两列。

internal class Configuration
{
    public string Key { get; set; }

    public string Value { get; set; }
}

接着需要定义一个ConfigurationDbContext用于存储和访问配置。

internal class ConfigurationDbContext : DbContext
{
    private EFConfigurationOptionsBuilder Builder { get; }

    public ConfigurationDbContext(EFConfigurationOptionsBuilder options) : base(options.DbContextOptions.Options)
    {
        Builder = options;
    }

    public DbSet<Configuration> Configurations { get; set; }
}

EFConfigurationOptionsBuilder是自定义的类它包含2个属性一个用于指定存储配置表的名称另一个用于配置数据库连接及其他配置。

EFConfigurationProvider

自定义Provider可继承ConfigurationProvider实现。在ConfigurationProvider中Load是一个虚方法自定义Provider需要实现Load方法。

internal class EFConfigurationProvider : ConfigurationProvider
{
    Action<EFConfigurationOptionsBuilder> OptionsAction { get; }

    public EFConfigurationProvider(Action<EFConfigurationOptionsBuilder> optionsAction)
    {
        OptionsAction = optionsAction;
    }

    public override void Load()
    {
        var builder = new EFConfigurationOptionsBuilder();
        OptionsAction(builder);
        using (var ctx = new ConfigurationDbContext(builder))
        {
            ctx.Database.EnsureCreated();
            Data = ctx.Configurations.ToDictionary(t => t.Key, t => t.Value);
        }
    }
}

EFConfigurationSource

EFConfigurationSource继承IConfigurationSource实现了Build方法在Build中返回EFConfigurationProvider。

internal class EFConfigurationSource : IConfigurationSource
{
    private readonly Action<EFConfigurationOptionsBuilder> _optionsAction;

    public EFConfigurationSource(Action<EFConfigurationOptionsBuilder> optionsAction)
    {
        _optionsAction = optionsAction;
    }

    public IConfigurationProvider Build(IConfigurationBuilder builder)
    {
        return new EFConfigurationProvider(_optionsAction);
    }
}

AddEntityFramework扩展方法

为添加EF配置源增加一个扩展方法。

public static class EFConfigurationExtensions
{
    public static IConfigurationBuilder AddEntityFramework(this IConfigurationBuilder builder, Action<EFConfigurationOptionsBuilder> setup)
    {
        return builder.Add(new EFConfigurationSource(setup));
    }
}

使用EF配置Provider

var builder = new ConfigurationBuilder()
    .AddEntityFramework(options =>
    {
        options.TableName = "configs";
        // 这里使用SQLite作为演示
        options.DbContextOptions.UseSqlite("Filename=config.db");
    });


Configuration = builder.Build();

上面我使用SQLite演示也可以使用SQL Server、MySql、PostgreSQL等。默认配置表的名称为Configuration。

最后

本项目已在github上开源地址ht t p s: / / g i t h u b  . co m / c h e n g xu l v t u / C x l t.Extensions.Configuration

在项目中使用可以执行下面的命令

Install-Package Cxlt.Extensions.Configuration.EF

dotnet add package Cxlt.Extensions.Configuration.EF














本文转自xmgdc51CTO博客,原文链接:http://blog.51cto.com/12953214/1942912 ,如需转载请自行联系原作者



相关文章:

  • hbase shell 启动报错
  • Ubuntu 16下安装zabbix agent
  • python2中MySQLdb加入超时及其重试功能
  • Redis实战(1)入门和适用场合
  • dell 1088 安装 windows xp 蓝屏的解决方法
  • Apache服务器之------https功能
  • mongodb3.4.4安装副本集,wt引擎配置优化(二)
  • PLSql使用
  • Tomcat
  • 44、BGP配置实验之Weight选路
  • 3星|《未来公司》:Uber简史
  • 洛谷——P1348 Couple number
  • Java MongoDB基本操作
  • 用SHELL脚本来防SSH和vsftpd暴力破解(第②版)
  • 8.10 shell特殊符号cut命令
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • CEF与代理
  • CentOS7简单部署NFS
  • css系列之关于字体的事
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • leetcode388. Longest Absolute File Path
  • Otto开发初探——微服务依赖管理新利器
  • PAT A1120
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • tab.js分享及浏览器兼容性问题汇总
  • ucore操作系统实验笔记 - 重新理解中断
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 基于HAProxy的高性能缓存服务器nuster
  • 基于组件的设计工作流与界面抽象
  • 理解在java “”i=i++;”所发生的事情
  • 前端临床手札——文件上传
  • 少走弯路,给Java 1~5 年程序员的建议
  • 《码出高效》学习笔记与书中错误记录
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • (9)STL算法之逆转旋转
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (算法)Game
  • (一一四)第九章编程练习
  • (译)2019年前端性能优化清单 — 下篇
  • (转)ABI是什么
  • (转)iOS字体
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • .htaccess配置常用技巧
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .NET 事件模型教程(二)
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .NET开发者必备的11款免费工具
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • [ 云计算 | AWS ] AI 编程助手新势力 Amazon CodeWhisperer:优势功能及实用技巧
  • [ajaxupload] - 上传文件同时附件参数值
  • [CareerCup] 13.1 Print Last K Lines 打印最后K行