实现.NET Core配置Provider之EF

《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
时间: 2024-08-28 23:45:42

实现.NET Core配置Provider之EF的相关文章

【转】10分钟就能学会的.NET Core配置

.NET Core为我们提供了一套用于配置的API,它为程序提供了运行时从文件.命令行参数.环境变量等读取配置的方法.配置都是键值对的形式,并且支持嵌套,.NET Core还内建了从配置反序列化为POCO对象的支持. 目前支持以下配置Provider: 文件(INI,JSON,XML) 命令行参数 环境变量 内存中的.NET对象 User Secrets Azure Key Vault 如果现有Provider不能满足你的使用场景,还允许自定义Provider,比如从数据库中读取. 配置相关的包

SQLite EF Core Database Provider

原文链接 This database provider allows Entity Framework Core to be used with SQLite. The provider is maintained as part of the Entity Framework Core project. Supported Database Engines SQLite (3.7 onwards) Supported Platforms .NET Framework (4.5.1 onward

ASP.NET Core 配置 EF 框架服务 - ASP.NET Core 基础教程 - 简单教程,简单编程

原文:ASP.NET Core 配置 EF 框架服务 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 配置 EF 框架服务 上一章节中我们了解了 Entity Framework 的基本工作原理和 DbContext ,我们也创建了一个自己的 HelloWorldDBContext. 本章节我们就来讲讲如何设置我们的 EF 框架来链接到 SQLite 数据库 配置 EF 框架服务 要让我们的 EF 框架的 DBContext 能够运行起来,我们需要更改一

ASP.NET Core 配置 EF SQLite 支持 - ASP.NET Core 基础教程 - 简单教程,简单编程

原文:ASP.NET Core 配置 EF SQLite 支持 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 配置 EF SQLite 支持 上一章节我有提到 macOS 版的 Visual Studio Community 没有携带 LocalDB,也就是说 LocalDB 暂时不支持 macOS 系统 虽然我可以在 Windows 上继续完成接下来的教程,但我觉得还是感觉不妥,如果其它使用苹果笔记本的人要去哪里找 Windows 的电脑 我临时改变

ASP.NET Core 2.2 基础知识(六) 配置(内含MySql+EF)

原文:ASP.NET Core 2.2 基础知识(六) 配置(内含MySql+EF) 先上一段代码,了解一下 .NET Core 配置数据的结构. 新建一个 控制台项目,添加一个文件 json.json ,文件内容如下: { "country": "cn", "person": { "id": 1, "address": { "addName": "chengdu"

.net Core 2.1 MVC+EF+Redis搭建

官方学习资料 搭建空MVC框架 1.创建一个空模板 2.创建文件夹 Controllers.Models.Views 3.在Controllers文件夹下创建HomeController.cs 选择Controllers文件夹,右键-添加-新建项,选择MVC控制器类,添加HomeController.cs. using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks

ASP.NET Core 配置 Entity Framework Core - ASP.NET Core 基础教程 - 简单教程,简单编程

原文:ASP.NET Core 配置 Entity Framework Core - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 配置 Entity Framework Core 上一章节学习完了视图,其实我们应该立即着手讲解模型的,但 ASP.NET Core MVC 中的模型和 Entity Framework 有相当大的关系,所以,在此之前,我们先来讲讲 Entity Framework Core 和如何配置它 本章中,我们将设置和配置我们的应用程

Asp.net Core 2.1使用 EF Core 简单增删改查操作数据库

Asp.net Core 2.1使用 EF Core 简单增删改查操作数据库 大概步骤如下5步: 1.创建项目(Asp.net Core 2.1项目) 2.项目使用EF Core 3.建立实体 4.生成迁移文件(生成数据库) 5.使用VS工具生成视图.控制器代码 示例代码下载  https://github.com/ZhMartincheng/NetCoreDemo.git 1.创建项目(Asp.net Core 2.1项目) 选择.net core 版本2.1 基础项目创建成功 2.项目使用E

Net core学习系列(八)——Net Core配置

一.简介 NET Core为我们提供了一套用于配置的API,它为程序提供了运行时从文件.命令行参数.环境变量等读取配置的方法.配置都是键值对的形式,并且支持嵌套,.NET Core还内建了从配置反序列化为POCO对象的支持. 目前支持以下配置Provider: 文件(INI,JSON,XML) 命令行参数 环境变量 内存中的.NET对象 User Secrets Azure Key Vault 如果现有Provider不能满足你的使用场景,还允许自定义Provider,比如从数据库中读取. 二.