实现.NET Core配置Provider之EF
admin
2023-05-22 12:22:44
0

《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了。

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 Configurations { get; set; }
}

EFConfigurationOptionsBuilder是自定义的类它包含2个属性一个用于指定存储配置表的名称另一个用于配置数据库连接及其他配置。

EFConfigurationProvider

自定义Provider可继承ConfigurationProvider实现。在ConfigurationProvider中Load是一个虚方法自定义Provider需要实现Load方法。

internal class EFConfigurationProvider : ConfigurationProvider
{
    Action OptionsAction { 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

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);
    }
}

AddEntityFramework扩展方法

为添加EF配置源增加一个扩展方法。

public static class EFConfigurationExtensions
{
    public static IConfigurationBuilder AddEntityFramework(this IConfigurationBuilder builder, Action 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



相关内容

热门资讯

制胜|第六集《联战联胜》大图速... 思想解读类融媒体片《制胜》今日收官第六集《联战联胜》震撼上新2016年2月1日习主席向五大战区授予军...
我国经济动能向新结构向优(读数... 四川省达州市通川区北山镇丰登村的麦田间,农民将刚收割的小麦装车。邓良奎摄(人民视觉)数据来源:国家统...
“意大利、德国还好意思指责西班... 一边高调批评西班牙的移民大赦政策“吸引非法移民”,一边却悄悄为本国非法入境者大开绿灯——意大利、德国...
电脑如何与打印机连接 打印机的种类很多,按打印元件对纸是否有击打动作,分击打式打印机与非击打式打印机。那么电脑如何与打印机...
怎么在电脑上添加打印机步骤 在现代社会,打印机是一个非常重要的办公设备,它能够将电子文件转化为实体纸质文件。然而,许多人在次使用...
电脑如何添加打印机驱动程序 电脑在跟打印机一起使用的`时候,我们要在电脑上安装好相应的驱动程序才行。那么电脑如何添加打印机驱动程...
韦唯回忆10年跨国婚姻:完全就... 近日,韦唯直言嫁给瑞典钢琴家完全就是上当,没爱过他。结婚前不知道对方比自己大25岁,表面光鲜的10年...
打印机与电脑如何连接打印 首先把电脑和打印机之间的连线在专用接口连接起来,下一步在电脑上点击“添加打印机”的选项。选择“添加本...
如何在电脑上安装打印机 电脑上... 电脑上安装打印机只需要在设置选项中找到打印机按要求添加即可。具体步骤如下:1.插入电源并把打印机us...
日本2026年度防务白皮书,用... 日本政府于今日在防卫省官网上披露了其2026年度的国防白皮书。其中,日本方面提出一套极具争议的新叙事...