深入理解.NET Core中的配置Configuration的方法
什么是配置
.NET中的配置,本質(zhì)上就是key-value鍵值對(duì),并且key和value都是字符串類型。
在.NET中提供了多種配置提供程序來對(duì)不同的配置進(jìn)行讀取、寫入、重載等操作,這里我們以為.NET 的源碼項(xiàng)目為例,來看下.NET中的配置主要是有那些類庫。下面這個(gè)截圖是.NET 源碼中和配置相關(guān)的所有類庫,所有配置相關(guān)的類庫都是都是以Microsoft.Extensions.Configuration開頭的。
貌似很多,沒關(guān)系我們來簡單理解一下。
類庫名稱 | 類庫作用 |
---|---|
1、Microsoft.Extensions.Configuration.Abstractions | 定義配置相關(guān)的接口,其他所有配置類庫都必須引用這個(gè)類庫 |
2、Microsoft.Extensions.Configuration | Microsoft.Extensions.Configuration.Abstractions類庫的簡單實(shí)現(xiàn) |
3、配置提供程序:Microsoft.Extensions.Configuration.CommandLine | 基于命令行的配置提供程序,負(fù)責(zé)對(duì)命令行的配置進(jìn)行讀寫、載入、重載等操作。 |
4、配置提供程序:Microsoft.Extensions.Configuration.EnvironmentVariables | 基于環(huán)境變量的配置提供程序,負(fù)責(zé)對(duì)環(huán)境變量的配置進(jìn)行讀寫、載入、重載等操作 |
5、配置提供程序:Microsoft.Extensions.Configuration.FileExtensions | 基于的文件提供程序的基類庫,文件提供程序包括基于Json文件、Ini文件、Xml文件或者自定義文件等。 |
6、配置提供程序:Microsoft.Extensions.Configuration.Json | 基于Json文件的配置提供程序程序,負(fù)責(zé)從Json文本文件中對(duì)配置讀寫、載入、重載等操作。 |
7、配置提供程序:Microsoft.Extensions.Configuration.Ini | 基于Ini文件的配置提供程序,負(fù)責(zé)從Ini文件中對(duì)配置進(jìn)行讀寫、載入、重載等操作。 |
8、配置提供程序:Microsoft.Extensions.Configuration.UserSecrets | 基于UserSecrets的配置提供程序,這個(gè)本質(zhì)上也是一種基于Json文件類型的配置程序。主要用于管理應(yīng)用機(jī)密 |
9、Microsoft.Extensions.Configuration.Binder | 負(fù)責(zé)將key-value鍵值對(duì)的配置列表綁定到指定的C#實(shí)體類上,方便程序使用。 |
從上面可以看到,主要有四個(gè)類庫:第1個(gè)類庫Abstractions
負(fù)責(zé)定義配置的一些接口,第2個(gè)類庫Configuration
負(fù)責(zé)定義配置的簡單實(shí)現(xiàn)。第3到第8個(gè)類庫都是具體的配置提供程序,第9個(gè)類庫Binder
負(fù)責(zé)將配置綁定到指定的的Model,方便程序使用。
配置提供程序,.NET中有多個(gè)類庫提供程序,每個(gè)類庫提供程序都是以單獨(dú)的類庫向外提供,基本上每個(gè)類庫就是三個(gè)文件,分別是ConfigurationExtensions.cs、ConfigurationProvider.cs和ConfigurationSource.cs,這三個(gè)類分別表示配置的擴(kuò)展方法、配置提供程序和配置源。配置源用于生成配置提供程序。
在第2個(gè)類庫中,微軟幫助我們實(shí)現(xiàn)了一個(gè)基于類庫的配置提供程序,我們?cè)诹斜碇袥]有單獨(dú)列舉這個(gè)類庫提供程序。
配置源IConfigurationSource
配置源表示一個(gè)單獨(dú)的配置集合,可以表示來自內(nèi)存的配置源、來自Json文件的配置源。但是配置源不直接提供對(duì)配置的訪問操作,它只有一個(gè)接口Build
,該接口一個(gè)具體的配置提供程序IConfigurationProvider
,每個(gè)配置提供程序負(fù)責(zé)對(duì)配置的讀取、寫入、載入配置、重載配置等訪問操作。
public interface IConfigurationSource { IConfigurationProvider Build(IConfigurationBuilder builder); }
配置提供程序IConfigurationProvider
配置提供程序負(fù)責(zé)實(shí)現(xiàn)配置的設(shè)置、讀取、重載等功能,并以鍵值對(duì)形式提供配置。
public interface IConfigurationProvider { //讀取配置 bool TryGet(string key, out string? value); //修改配置 void Set(string key, string? value); //獲取重載配置的Token IChangeToken GetReloadToken(); //載入配置 void Load(); //獲取指定父路徑下的直接子節(jié)點(diǎn)Key,然后 Concat(earlierKeys) 一同返回 IEnumerable<string> GetChildKeys(IEnumerable<string> earlierKeys, string? parentPath); }
配置構(gòu)建者IConfigurationBuilder
上面的IConfigurationSource和IConfigurationProvider分別表示一種數(shù)據(jù)源和對(duì)一種數(shù)據(jù)源進(jìn)行讀寫操作。但是一個(gè)程序的配置可能來自很多地方,可能一部分配置來自環(huán)境變量、一部分配置來自文件等等。這個(gè)時(shí)候IConfigurationBuilder配置構(gòu)建者就誕生了,IConfigurationBuilder接口維護(hù)了多個(gè)配置源,并提供一個(gè)Build方法生成一個(gè)統(tǒng)一的配置IConfigurationRoot
來統(tǒng)一對(duì)整個(gè)程序的配置進(jìn)行讀取、寫入、重載等操作。但是這里大家注意,IConfigurationRoot
對(duì)配置的訪問,本質(zhì)上還是通過配置提供程序IConfigurationProvider
來進(jìn)行的。
假設(shè),當(dāng)我們查找一個(gè)Key為Name的配置,IConfigurationRoot
內(nèi)部會(huì)遍歷所有Sources
屬性生成的IConfigurationProvider
,然后依次調(diào)用IConfigurationProvider
的TryGet來獲取Name的具體配置數(shù)據(jù)。
public interface IConfigurationBuilder { //保存Build的一些公開的字典屬性,有需要的化可以使用該字段存放一些變量 IDictionary<string, object> Properties { get; } //來自多個(gè)地方的配置源集合 IList<IConfigurationSource> Sources { get; } //向Sources屬性中添加一個(gè)配置源 IConfigurationBuilder Add(IConfigurationSource source); //基于所有配置源生成一個(gè)全局的配置,供程序讀寫,一般我們都是用這個(gè)接口對(duì)配置進(jìn)行讀寫。 IConfigurationRoot Build(); }
配置構(gòu)建者實(shí)現(xiàn)類ConfigurationBuilder
在具體的配置構(gòu)建者的Build方法中,我們可以看到,它依次調(diào)用IConfigurationProvider
的Buid方法生成多個(gè)配置提供程序IConfigurationProvider
,然后將所有的配置提供程序providers
傳給了ConfigurationRoot
。ConfigurationRoot
正是調(diào)用providers
的一系列方法實(shí)現(xiàn)對(duì)配置的讀取、寫入、重載等操作。
public class ConfigurationBuilder : IConfigurationBuilder { private readonly List<IConfigurationSource> _sources = new(); public IList<IConfigurationSource> Sources => _sources; public IDictionary<string, object> Properties { get; } = new Dictionary<string, object>(); public IConfigurationBuilder Add(IConfigurationSource source) { ThrowHelper.ThrowIfNull(source); _sources.Add(source); return this; } public IConfigurationRoot Build() { var providers = new List<IConfigurationProvider>(); foreach (IConfigurationSource source in _sources) { IConfigurationProvider provider = source.Build(this); providers.Add(provider); } return new ConfigurationRoot(providers); } }
配置接口IConfiguration
這個(gè)接口就是最核心的配置接口,提供了對(duì)配置的讀取、寫入、重載等操作,它的實(shí)現(xiàn)類是ConfigurationRoot
,上面我們已經(jīng)介紹過,IConfiguration
本身還是通過各個(gè)配置提供程序?qū)ε渲眠M(jìn)行訪問操作。
public interface IConfiguration { //獲取或設(shè)置配置 string? this[string key] { get; set; } //獲取指定key的配置子節(jié)點(diǎn) IConfigurationSection GetSection(string key); //獲取當(dāng)前配置的直接子節(jié)點(diǎn)列表 IEnumerable<IConfigurationSection> GetChildren(); //當(dāng)配置發(fā)生變更時(shí)的token IChangeToken GetReloadToken(); }
配置接口IConfigurationRoot
IConfigurationRoot其實(shí)是配置的根接口,該接口有個(gè)最重要的屬性Providers
負(fù)責(zé)保存所有的配置提供程序,IConfiguration
對(duì)配置的訪問,就是通過遍歷這個(gè)Providers
來訪問的。
public interface IConfigurationRoot : IConfiguration { //強(qiáng)制重載所有配置 void Reload(); //所有配置提供程序 IEnumerable<IConfigurationProvider> Providers { get; } }
實(shí)現(xiàn)自定義配置提供程序
實(shí)現(xiàn)自定義配置提供程序,其實(shí)只需要實(shí)現(xiàn)三個(gè)類就可以,一個(gè)是配置源、一個(gè)是配置提供程序、一個(gè)是針對(duì)當(dāng)前配置的擴(kuò)展方法。第三個(gè)類可有可無,不過我們一般都要實(shí)現(xiàn)。我們來參考下基于命令行的配置提供程序類庫的文件。
接下來,我們來實(shí)現(xiàn)一個(gè)基于數(shù)據(jù)庫的配置提供程序,分別實(shí)現(xiàn)配置源DataBaseConfigurationSource
、配置提供程序DataBaseConfigurationExtensions
和擴(kuò)展方法類DataBaseConfigurationExtensions
,當(dāng)然在這里我們只做對(duì)應(yīng)的演示,沒有實(shí)現(xiàn)具體的配置方法。
public class DataBaseConfigurationSource : IConfigurationSource { public IConfigurationProvider Build(IConfigurationBuilder builder) { return new DataBaseConfigurationProvider(); } } public class DataBaseConfigurationProvider : ConfigurationProvider { public override void Load() { base.Load(); //讀取數(shù)據(jù)庫配置 } } public static class DataBaseConfigurationExtensions { public static IConfigurationBuilder AddDb(this IConfigurationBuilder configurationBuilder) { configurationBuilder.Sources.Add(new DataBaseConfigurationSource()); return configurationBuilder; } }
調(diào)用自定義配置程序
static void Main(string[] args) { var builder = new ConfigurationBuilder() .AddDb() .Build(); var value = builder["key"]; }
到此這篇關(guān)于深入理解.NET Core中的配置Configuration的方法的文章就介紹到這了,更多相關(guān).NET Core配置Configuration內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- asp.net?core?configuration配置讀取的實(shí)現(xiàn)
- ASP.NET?Core配置設(shè)置之Configuration包
- ASP.NET?Core中的Configuration配置二
- ASP.NET?Core中的Configuration配置一
- 淺析.netcore中的Configuration具體使用
- .Net Core配置Configuration具體實(shí)現(xiàn)
- 如何在ASP.NET Core 的任意類中注入Configuration
- 詳解ASP.NET Core實(shí)現(xiàn)強(qiáng)類型Configuration讀取配置數(shù)據(jù)
相關(guān)文章
如何解決Ajax請(qǐng)求結(jié)果的緩存問題說明
2013-03-03.Net?Core應(yīng)用增強(qiáng)型跨平臺(tái)串口類庫CustomSerialPort()詳解
本文詳細(xì)講解了.Net?Core應(yīng)用增強(qiáng)型跨平臺(tái)串口類庫CustomSerialPort(),文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01ASP.NET MVC5網(wǎng)站開發(fā)用戶修改資料和密碼(六)
這篇文章主要介紹了ASP.NET MVC5網(wǎng)站開發(fā)用戶修改資料和密碼,本文即將結(jié)束member區(qū)域的用戶部分,感興趣的小伙伴們可以參考一下2015-09-09TrieTree服務(wù)-組件構(gòu)成及其作用介紹
本文將一步步教你配置和使用TrieTree服務(wù),需要的朋友可以參考下2013-01-01ASP.NET MVC5+EF6+EasyUI后臺(tái)管理系統(tǒng) 微信公眾平臺(tái)開發(fā)之資源環(huán)境準(zhǔn)備
這篇文章主要介紹了ASP.NET MVC5+EF6+EasyUI后臺(tái)管理系統(tǒng),微信公眾平臺(tái)開發(fā)之資源環(huán)境準(zhǔn)備,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09