实现自己的.NET Core配置Provider之EF
《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相关推荐
- 实现.NET Core配置Provider之EF
<10分钟就能学会.NET Core配置>里详细介绍了.NET Core配置的用法另外我还开源了自定义的配置ProviderEF配置Provider和Yaml配置Provider.本文先来 ...
- 实现自己的.NET Core配置Provider之Yaml
YAML是一种更适合人阅读的文件格式,很多大型的项目像Ruby on Rails都选择YAML作为配置文件的格式.如果项目的配置很少,用JSON或YAML没有多大差别.看看rails项目中的配置文件, ...
- 10分钟就能学会的.NET Core配置
.NET Core为我们提供了一套用于配置的API,它为程序提供了运行时从文件.命令行参数.环境变量等读取配置的方法.配置都是键值对的形式,并且支持嵌套,.NET Core还内建了从配置反序列化为PO ...
- 关于Asp.net core配置信息读取的源码分析梳理
概述 我们都知道asp.net core配置信息的读取离不开IConfigurationSource和IConfigurationProvider这两个类,ConfigurationSource可以提 ...
- ASP.NET Core 配置中心
前言 正如大家所知,在 .NET Core 中配置文件改成了 appsettings.json,表面上和 .NET Framework 的 web.config 或 app.config 好像没有太大 ...
- EF Core数据库Provider一览
当EF Core 1.x系列和2.0版本之间经过重大的重写时,所有EF Core数据库Provider都受到重创.从那时起,各种私人和商业开发团队一直在努力填补这个空白. 正文 当EF Core 1. ...
- ASP.NET Core配置Kestrel 网址Urls
ASP.NET Core中如何配置Kestrel Urls呢,大家可能都知道使用UseUrls() 方法来配置. 今天给介绍全面的ASP.NET Core 配置 Urls,使用多种方式配置Urls. ...
- class com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$Text
运行mapreduce遇到的奇芭的错: java.lang.ClassCastException: classcom.sun.jersey.core.impl.provider.entity.XMLJ ...
- ASP.NET Core 配置 - 创建自定义配置提供程序
ASP.NET Core 配置 - 创建自定义配置提供程序 在本文中,我们将创建一个自定义配置提供程序,从数据库读取我们的配置.我们已经了解了默认配置提供程序的工作方式,现在我们将实现我们自己的自定义 ...
最新文章
- C# - list数据填充到Dataset里
- 网络资源备份 杨萃先书
- JavaScript 读取CSV文件并转为js对象
- 真的汉子不多,褚时健褚老算一个
- 解决mybatis generator无法覆盖XML
- oracle常用表查询,ORACLE EBS常用表及查询语句(最终整理版)
- sun8134的Blog
- 微软官方工具_时隔20年再出发!微软官方推出最强Windows工具集
- Oracle物化视图和普通视图区别
- sublime3中如何快速生成html头部信息
- 一年级abb式词语并造句_一年级语文ABB式词语专项练习附答案,考考孩子!
- kb931125—rootsupd_kb931125-rootsupd补丁下载
- react实现简单的计算器功能。
- java中什么是线程不安全给出一个例子
- mysql几条相同的数据删除只留一条id最大的数据
- QA:笔记本如何选?
- MTCNN人脸检测---PNet网络训练
- 信息安全系统设计基础实验二—20135215黄伟业20135222胡御风
- android无线充电器推荐,和安卓通用的无线充电器门派推荐
- elasticsearch里面bulk的用法
热门文章
- 使用XMLConfiguration解析xml,properties等相应信息
- Android JSON原生解析的几种思路,以号码归属地,笑话大全,天气预报为例演示...
- C#导入导出.CSV文件
- Envoy实现.NET架构的网关(三)代理GRPC
- 中国移动云能力中心 Iaas 产品部软件开发工程师陈焱山:社区始于连接,也成就于连接...
- 【招聘(北京)】今天誉讯(北京)有限公司招聘高级.NET软件开发前端工程师
- 轻量NuGet服务—BaGet
- 很遗憾,总对工作挑挑拣拣的家伙,一般结局都不会太好
- 如何使用第三方日志记录提供程序替代.NET Core中的内置程序
- C# WPF开源控件库:MahApps.Metro