中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

實現.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

永新县| 芮城县| 龙陵县| 宝山区| 龙游县| 阿尔山市| 安西县| 桂平市| 通河县| 霞浦县| 台中市| 阳江市| 阿克| 金塔县| 建昌县| 绍兴市| 太保市| 雅江县| 曲水县| 宁蒗| 馆陶县| 宁陵县| 来凤县| 犍为县| 大悟县| 金门县| 射阳县| 体育| 林芝县| 巴东县| 安阳县| 邳州市| 吴桥县| 金塔县| 滁州市| 虎林市| 西安市| 西丰县| 兴文县| 云和县| 赤壁市|