《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

转载于:https://blog.51cto.com/12953214/1942912

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

  1. 实现自己的.NET Core配置Provider之EF

    <10分钟就能学会.NET Core配置>里详细介绍了.NET Core配置的用法,另外我还开源了自定义的配置Provider:EF配置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. EF Core数据库Provider一览

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

  5. EF Core 数据库 Provider 一览

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

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

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

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

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

  8. ASP.NET Core 开发-Entity Framework (EF) Core 1.0 Database First

    ASP.NET Core 开发-Entity Framework Core 1.0 Database First,ASP.NET Core 1.0 EF Core操作数据库. Entity Frame ...

  9. ASP.NET Core 配置中心

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

最新文章

  1. mysql存储netcdf数据_关于NetCDF与HDF5存储科学数据的观点?
  2. 辽宁省风力发电行业“十四五”前景规划及竞争策略分析报告2022-2028年版
  3. [转载] 杜拉拉升职记——07 管理者关心细节吗?
  4. RISC-V评估系列
  5. window.location.reload()会掉参数吗_iPhone手机电量不够用,你真的会用苹果吗?设置好这几个就OK了!...
  6. jquery 样式获取设置值_jQuery获取样式中的背景颜色属性值/颜色值
  7. 邮件格式转换html,HTML邮件模板 - lenglingx的个人页面 - OSCHINA - 中文开源技术交流社区...
  8. 坐等价格!小米Civi今日下午发布:女性用户青睐之选
  9. 麦肯锡指出布局金融生态圈对中国国内银行意义重大
  10. 用C语言编写顺序存储的线性表(含代码实现)
  11. 可可托海将打造研学旅游基地促经济发展
  12. Oracle系统查询的语句
  13. Spring中@Autowired注解用法
  14. BMP/JPG/PNG/GIF/有损压缩和无损压缩【转载整理】
  15. EPIC/Steam 手柄没反应问题解决办法
  16. 作业2.EVE ensp 模拟器CONSOLE接口密码设置
  17. linux高性能集群搭建,sge linux高性能集群的搭建与使用
  18. 新版本微信PC端小程序打不开 一直加载 白屏等问题及解决方案
  19. cesium实现相机绕地旋转效果
  20. SSM+医保业财一体化管理系统 毕业设计-附源码151023

热门文章

  1. 7-17 航空公司VIP客户查询 (10 分)
  2. 7-7 旅游规划 (8 分)
  3. 7-3 方格取数 (15 分)
  4. 7-113 堆栈操作合法性 (20 分)
  5. java面向对象编程的三大基本特性--封装,继承,多态
  6. java中二叉树_java后端学习路线
  7. api 微信内置浏览器js_微信小程序和HTML的区别
  8. 24暴力枚举四平方和
  9. 2014025650《嵌入式程序设计》第一周学习总结
  10. sql的 select