日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

实现自己的.NET Core配置Provider之EF

發布時間:2023/12/4 asp.net 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 实现自己的.NET Core配置Provider之EF 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

《10分鐘就能學會.NET Core配置》里詳細介紹了.NET Core配置的用法,另外我還開源了自定義的配置Provider:EF配置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上開源,地址:https://github.com/chengxulvtu/Cxlt.Extensions.Configuration

在項目中使用可以執行下面的命令

Install-Package Cxlt.Extensions.Configuration.EF

dotnet add package Cxlt.Extensions.Configuration.EF

下篇文章《實現自己的.NET Core配置Provider之Yaml》將講解Yaml配置Provider的細節。

原文地址:http://www.cnblogs.com/nianming/p/7092652.html


.NET社區新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關注

總結

以上是生活随笔為你收集整理的实现自己的.NET Core配置Provider之EF的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。