《10分钟就能学的会。网络核心配置》里详细介绍了。净核心配置的用法另外我还开源了自定义的配置ProviderEF配置提供者和Yaml配置供应商。本文先来聊聊EF配置提供者的实现其中会涉及到EntityFramework核心的知识不熟悉也没关系且听我慢慢讲来。
配置执行流程
在使用配置的时候都是先<代码>新ConfigurationBuilder()> 代码,最后调用<代码>建立()代码>方法赋值给<代码>配置代码>属性。那我们就从这个建造方法说起。
建造方法做了什么呢它遍历了所有的配置源等等配置源哪来的还记不记得<代码> AddJsonFile 代码>,<代码> AddCommandLine 代码>这些扩展方法它们做的事情就是将配置源添加到ConfigurationBuild中。每个配置源都有一个制造方法它返回一个提供者。遍历所有配置源时调用配置源的制造方法就获得了所有配置源的提供者最后通过构造函数传给<代码> ConfigurationRoot> 代码。
每个提供者里都有一个<代码> 代码>方加载法ConfigurationRoot的构造函数会遍历所有的提供者调用它的负载方法.Load方法里需要做的就是把配置源里的配置转换为<代码> IDictionary<字符串,string> 代码>。
了解了配置执行的流程就可以动手实现自己的提供者了。
EF存储
Json配置提供者的配置存储在Json文件中基于英孚的提供者的配置则是存储在数据库中因为使用了英孚我们不需要关心使用的是什么数据库。
在数据库中存储配置不支持嵌套和数组只是简单的键值对形式对应数据库表中的两列,使用EF需要先定义一个实体存储配置它包含两个属性对应数据库表中的两列。
internal class 配置 { ,,,public string Key {组,得到,,,} ,,,public string Value {组,得到,,,} }
接着需要定义一个<代码> ConfigurationDbContext> 代码用于存储和访问配置。
internal class ConfigurationDbContext : DbContext { ,,,private EFConfigurationOptionsBuilder Builder {,得到;} ,,,public ConfigurationDbContext (EFConfigurationOptionsBuilder 选项),:,基地(options.DbContextOptions.Options) ,,,{ ,,,,,,,Builder =,选项; ,,,} ,,,public DbSet, Configurations {组,得到,,,} }
<代码> EFConfigurationOptionsBuilder> 代码是自定义的类它包含2个属性一个用于指定存储配置表的名称另一个用于配置数据库连接及其他配置。
EFConfigurationProvider
自定义提供者可继承<代码> ConfigurationProvider 代码>实现。在ConfigurationProvider中负载是一个虚方法自定义提供者需要实现加载方法。
internal class EFConfigurationProvider : ConfigurationProvider { ,,,Action, OptionsAction {,得到;} ,,,public EFConfigurationProvider (Action EFConfigurationSource
EFConfigurationSource继承<代码> IConfigurationSource 代码>实现了建造方法在构建中返回EFConfigurationProvider。
internal class EFConfigurationSource : IConfigurationSource { ,,,private readonly Action, _optionsAction; ,,,public EFConfigurationSource (Action AddEntityFramework扩展方法
为添加EF配置源增加一个扩展方法。
public static class EFConfigurationExtensions { ,,,public static IConfigurationBuilder AddEntityFramework(却;能够IConfigurationBuilder 构建器,,Action,设置) ,,,{ ,,,,,,,return builder.Add (new EFConfigurationSource(设置); ,,,} } 实现。网络核心配置提供者之EF