《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
。
了解了配置执行的流程就可以动手实现自己的Provider了。
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 DbSetConfigurations { get; set; } }
EFConfigurationOptionsBuilder
是自定义的类它包含2个属性一个用于指定存储配置表的名称另一个用于配置数据库连接及其他配置。
自定义Provider可继承ConfigurationProvider
实现。在ConfigurationProvider中Load是一个虚方法自定义Provider需要实现Load方法。
internal class EFConfigurationProvider : ConfigurationProvider { ActionOptionsAction { get; } public EFConfigurationProvider(Action 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继承IConfigurationSource
实现了Build方法在Build中返回EFConfigurationProvider。
internal class EFConfigurationSource : IConfigurationSource { private readonly Action_optionsAction; public EFConfigurationSource(Action optionsAction) { _optionsAction = optionsAction; } public IConfigurationProvider Build(IConfigurationBuilder builder) { return new EFConfigurationProvider(_optionsAction); } }
为添加EF配置源增加一个扩展方法。
public static class EFConfigurationExtensions { public static IConfigurationBuilder AddEntityFramework(this IConfigurationBuilder builder, Actionsetup) { return builder.Add(new EFConfigurationSource(setup)); } }
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
另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。