《10分钟就能学会.NET Core配置》里详细介绍了.NET Core配置的用法,另外我还开源了自定义的配置Provider:EF配置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上开源,地址:https://github.com/chengxulvtu/Cxlt.Extensions.Configuration

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

Install-Package Cxlt.Extensions.Configuration.EF

dotnet add package Cxlt.Extensions.Configuration.EF

下篇文章《实现自己的.NET Core配置Provider之Yaml》将讲解Yaml配置Provider的细节。

原文地址:http://www.cnblogs.com/nianming/p/7092652.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

实现自己的.NET Core配置Provider之EF相关推荐

  1. 实现.NET Core配置Provider之EF

    <10分钟就能学会.NET Core配置>里详细介绍了.NET Core配置的用法另外我还开源了自定义的配置ProviderEF配置Provider和Yaml配置Provider.本文先来 ...

  2. 实现自己的.NET Core配置Provider之Yaml

    YAML是一种更适合人阅读的文件格式,很多大型的项目像Ruby on Rails都选择YAML作为配置文件的格式.如果项目的配置很少,用JSON或YAML没有多大差别.看看rails项目中的配置文件, ...

  3. 10分钟就能学会的.NET Core配置

    .NET Core为我们提供了一套用于配置的API,它为程序提供了运行时从文件.命令行参数.环境变量等读取配置的方法.配置都是键值对的形式,并且支持嵌套,.NET Core还内建了从配置反序列化为PO ...

  4. 关于Asp.net core配置信息读取的源码分析梳理

    概述 我们都知道asp.net core配置信息的读取离不开IConfigurationSource和IConfigurationProvider这两个类,ConfigurationSource可以提 ...

  5. ASP.NET Core 配置中心

    前言 正如大家所知,在 .NET Core 中配置文件改成了 appsettings.json,表面上和 .NET Framework 的 web.config 或 app.config 好像没有太大 ...

  6. EF Core数据库Provider一览

    当EF Core 1.x系列和2.0版本之间经过重大的重写时,所有EF Core数据库Provider都受到重创.从那时起,各种私人和商业开发团队一直在努力填补这个空白. 正文 当EF Core 1. ...

  7. ASP.NET Core配置Kestrel 网址Urls

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

  8. class com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$Text

    运行mapreduce遇到的奇芭的错: java.lang.ClassCastException: classcom.sun.jersey.core.impl.provider.entity.XMLJ ...

  9. ASP.NET Core 配置 - 创建自定义配置提供程序

    ASP.NET Core 配置 - 创建自定义配置提供程序 在本文中,我们将创建一个自定义配置提供程序,从数据库读取我们的配置.我们已经了解了默认配置提供程序的工作方式,现在我们将实现我们自己的自定义 ...

最新文章

  1. C# - list数据填充到Dataset里
  2. 网络资源备份 杨萃先书
  3. JavaScript 读取CSV文件并转为js对象
  4. 真的汉子不多,褚时健褚老算一个
  5. 解决mybatis generator无法覆盖XML
  6. oracle常用表查询,ORACLE EBS常用表及查询语句(最终整理版)
  7. sun8134的Blog
  8. 微软官方工具_时隔20年再出发!微软官方推出最强Windows工具集
  9. Oracle物化视图和普通视图区别
  10. sublime3中如何快速生成html头部信息
  11. 一年级abb式词语并造句_一年级语文ABB式词语专项练习附答案,考考孩子!
  12. kb931125—rootsupd_kb931125-rootsupd补丁下载
  13. react实现简单的计算器功能。
  14. java中什么是线程不安全给出一个例子
  15. mysql几条相同的数据删除只留一条id最大的数据
  16. QA:笔记本如何选?
  17. MTCNN人脸检测---PNet网络训练
  18. 信息安全系统设计基础实验二—20135215黄伟业20135222胡御风
  19. android无线充电器推荐,和安卓通用的无线充电器门派推荐
  20. elasticsearch里面bulk的用法

热门文章

  1. 使用XMLConfiguration解析xml,properties等相应信息
  2. Android JSON原生解析的几种思路,以号码归属地,笑话大全,天气预报为例演示...
  3. C#导入导出.CSV文件
  4. Envoy实现.NET架构的网关(三)代理GRPC
  5. 中国移动云能力中心 Iaas 产品部软件开发工程师陈焱山:社区始于连接,也成就于连接...
  6. 【招聘(北京)】今天誉讯(北京)有限公司招聘高级.NET软件开发前端工程师
  7. 轻量NuGet服务—BaGet
  8. 很遗憾,总对工作挑挑拣拣的家伙,一般结局都不会太好
  9. 如何使用第三方日志记录提供程序替代.NET Core中的内置程序
  10. C# WPF开源控件库:MahApps.Metro