亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

實現.NET Core配置Provider之EF

發布時間:2020-05-27 22:36:53 來源:網絡 閱讀:554 作者:xmgdc 欄目:數據庫

《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



向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

横峰县| 科技| 军事| 百色市| 天峻县| 平阳县| 岳阳县| 九江县| 湖州市| 武宣县| 天气| 衡阳县| 米泉市| 泰安市| 西盟| 文水县| 永新县| 平舆县| 巴南区| 大邑县| 新津县| 江津市| 中江县| 安乡县| 栾川县| 成安县| 林芝县| 渭南市| 南召县| 榆树市| 澎湖县| 万宁市| 浮山县| 西贡区| 安宁市| 宜黄县| 彰化县| 云阳县| 定州市| 色达县| 鲜城|