理解.NET Core中的配置Configuration

什么是配置

.NET中的配置,本質上就是key-value鍵值對,并且key和value都是字符串類型。

在.NET中提供了多種配置提供程序來對不同的配置進行讀取、寫入、重載等操作,這里我們以為.NET 的源碼項目為例,來看下.NET中的配置主要是有那些類庫。下面這個截圖是.NET 源碼中和配置相關的所有類庫,所有配置相關的類庫都是都是以Microsoft.Extensions.Configuration開頭的。

貌似很多,沒關系我們來簡單理解一下。

類庫名稱類庫作用
1、Microsoft.Extensions.Configuration.Abstractions定義配置相關的接口,其他所有配置類庫都必須引用這個類庫
2、Microsoft.Extensions.ConfigurationMicrosoft.Extensions.Configuration.Abstractions類庫的簡單實現
3、配置提供程序:Microsoft.Extensions.Configuration.CommandLine基于命令行的配置提供程序,負責對命令行的配置進行讀寫、載入、重載等操作。
4、配置提供程序:Microsoft.Extensions.Configuration.EnvironmentVariables基于環境變量的配置提供程序,負責對環境變量的配置進行讀寫、載入、重載等操作
5、配置提供程序:Microsoft.Extensions.Configuration.FileExtensions基于的文件提供程序的基類庫,文件提供程序包括基于Json文件、Ini文件、Xml文件或者自定義文件等。
6、配置提供程序:Microsoft.Extensions.Configuration.Json基于Json文件的配置提供程序程序,負責從Json文本文件中對配置讀寫、載入、重載等操作。
7、配置提供程序:Microsoft.Extensions.Configuration.Ini基于Ini文件的配置提供程序,負責從Ini文件中對配置進行讀寫、載入、重載等操作。
8、配置提供程序:Microsoft.Extensions.Configuration.UserSecrets基于UserSecrets的配置提供程序,這個本質上也是一種基于Json文件類型的配置程序。主要用于管理應用機密
9、Microsoft.Extensions.Configuration.Binder負責將key-value鍵值對的配置列表綁定到指定的C#實體類上,方便程序使用。

從上面可以看到,主要有四個類庫:第1個類庫Abstractions負責定義配置的一些接口,第2個類庫Configuration負責定義配置的簡單實現。第3到第8個類庫都是具體的配置提供程序,第9個類庫Binder負責將配置綁定到指定的的Model,方便程序使用。

配置提供程序,.NET中有多個類庫提供程序,每個類庫提供程序都是以單獨的類庫向外提供,基本上每個類庫就是三個文件,分別是ConfigurationExtensions.cs、ConfigurationProvider.cs和ConfigurationSource.cs,這三個類分別表示配置的擴展方法、配置提供程序和配置源。配置源用于生成配置提供程序。

在第2個類庫中,微軟幫助我們實現了一個基于類庫的配置提供程序,我們在列表中沒有單獨列舉這個類庫提供程序。

配置源IConfigurationSource

配置源表示一個單獨的配置集合,可以表示來自內存的配置源、來自Json文件的配置源。但是配置源不直接提供對配置的訪問操作,它只有一個接口Build,該接口一個具體的配置提供程序IConfigurationProvider?,每個配置提供程序負責對配置的讀取、寫入、載入配置、重載配置等訪問操作。

public interface IConfigurationSource
{IConfigurationProvider Build(IConfigurationBuilder builder);
}

配置提供程序IConfigurationProvider

配置提供程序負責實現配置的設置、讀取、重載等功能,并以鍵值對形式提供配置。

public interface IConfigurationProvider
{//讀取配置bool TryGet(string key, out string? value);//修改配置void Set(string key, string? value);//獲取重載配置的TokenIChangeToken GetReloadToken();//載入配置void Load();//獲取指定父路徑下的直接子節點Key,然后 Concat(earlierKeys) 一同返回IEnumerable<string> GetChildKeys(IEnumerable<string> earlierKeys, string? parentPath);
}

配置構建者IConfigurationBuilder

上面的IConfigurationSource和IConfigurationProvider分別表示一種數據源和對一種數據源進行讀寫操作。但是一個程序的配置可能來自很多地方,可能一部分配置來自環境變量、一部分配置來自文件等等。這個時候IConfigurationBuilder配置構建者就誕生了,IConfigurationBuilder接口維護了多個配置源,并提供一個Build方法生成一個統一的配置IConfigurationRoot?來統一對整個程序的配置進行讀取、寫入、重載等操作。但是這里大家注意,IConfigurationRoot?對配置的訪問,本質上還是通過配置提供程序IConfigurationProvider來進行的。

假設,當我們查找一個Key為Name的配置,IConfigurationRoot?內部會遍歷所有Sources?屬性生成的IConfigurationProvider,然后依次調用IConfigurationProvider的TryGet來獲取Name的具體配置數據。

public interface IConfigurationBuilder
{//保存Build的一些公開的字典屬性,有需要的化可以使用該字段存放一些變量IDictionary<string, object> Properties { get; }//來自多個地方的配置源集合IList<IConfigurationSource> Sources { get; }//向Sources屬性中添加一個配置源IConfigurationBuilder Add(IConfigurationSource source);//基于所有配置源生成一個全局的配置,供程序讀寫,一般我們都是用這個接口對配置進行讀寫。IConfigurationRoot Build();
}

配置構建者實現類ConfigurationBuilder

在具體的配置構建者的Build方法中,我們可以看到,它依次調用IConfigurationProvider的Buid方法生成多個配置提供程序IConfigurationProvider?,然后將所有的配置提供程序providers?傳給了ConfigurationRootConfigurationRoot正是調用providers?的一系列方法實現對配置的讀取、寫入、重載等操作。

 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

這個接口就是最核心的配置接口,提供了對配置的讀取、寫入、重載等操作,它的實現類是ConfigurationRoot,上面我們已經介紹過,IConfiguration本身還是通過各個配置提供程序對配置進行訪問操作。

public interface IConfiguration
{//獲取或設置配置string? this[string key] { get; set; }//獲取指定key的配置子節點IConfigurationSection GetSection(string key);//獲取當前配置的直接子節點列表IEnumerable<IConfigurationSection> GetChildren();//當配置發生變更時的tokenIChangeToken GetReloadToken();
}

配置接口IConfigurationRoot

IConfigurationRoot其實是配置的根接口,該接口有個最重要的屬性Providers?負責保存所有的配置提供程序,IConfiguration對配置的訪問,就是通過遍歷這個Providers來訪問的。

public interface IConfigurationRoot : IConfiguration
{//強制重載所有配置void Reload();//所有配置提供程序IEnumerable<IConfigurationProvider> Providers { get; }
}

實現自定義配置提供程序

實現自定義配置提供程序,其實只需要實現三個類就可以,一個是配置源、一個是配置提供程序、一個是針對當前配置的擴展方法。第三個類可有可無,不過我們一般都要實現。我們來參考下基于命令行的配置提供程序類庫的文件。

接下來,我們來實現一個基于數據庫的配置提供程序,分別實現配置源DataBaseConfigurationSource?、配置提供程序DataBaseConfigurationExtensions?和擴展方法類DataBaseConfigurationExtensions,當然在這里我們只做對應的演示,沒有實現具體的配置方法。

public class DataBaseConfigurationSource : IConfigurationSource
{public IConfigurationProvider Build(IConfigurationBuilder builder){return new DataBaseConfigurationProvider();}
}public class DataBaseConfigurationProvider : ConfigurationProvider
{public override void Load(){base.Load();//讀取數據庫配置}
}
public static class DataBaseConfigurationExtensions
{public static IConfigurationBuilder AddDb(this IConfigurationBuilder configurationBuilder){configurationBuilder.Sources.Add(new DataBaseConfigurationSource());return configurationBuilder;}
}

調用自定義配置程序

static void Main(string[] args)
{var builder = new ConfigurationBuilder().AddDb().Build();var value = builder["key"];
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/76584.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/76584.shtml
英文地址,請注明出處:http://en.pswp.cn/web/76584.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

windows服務器及網絡:論如何安裝(虛擬機)

今天我要介紹的是&#xff1a;在Windows中對于安裝系統&#xff08;虛擬機的步驟以及相關的安裝事宜&#xff09;&#xff0c;事不宜遲&#xff0c;讓我們來看看系統安裝&#xff08;虛擬機&#xff09;是怎么操作的&#xff1a; 對現在來說&#xff0c;安裝電腦系統已經是非常…

shardingsphere-jdbc集成Seata分布式事務

1、導入相關依賴 <!-- shardingsphere-jdbc --><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc</artifactId><version>5.5.1</version></dependency><!-- shardingspher…

05-DevOps-Jenkins自動拉取構建代碼

新建Gitlab倉庫 先在Gitab上創建一個代碼倉庫&#xff0c;選擇創建空白項目 安裝說明進行填寫&#xff0c;然后點擊創建項目 創建好的倉庫是空的&#xff0c;什么都沒有 新建一個springboot項目&#xff0c;用于代碼上傳使用。 只是為了測試代碼上傳功能&#xff0c;所以代碼…

C#核心(24)結構體和類的區別,抽象類和接口的區別(面試常問)

前言 隨著上一節我們對StringBulider的講解落下帷幕&#xff0c;c#核心的知識點我們也即將告一段落,我們講完了面向對象要用的三大特性&#xff08;封裝&#xff0c;繼承&#xff0c;多態&#xff09;和七大原則。期中自然也不乏一些小的散的碎的的知識點。 今天我們要講的也…

HTMLCSS實現異環網站,期末web作業

本網站是我在學習前端時敲得&#xff0c;僅供學習使用。 這段代碼是一個完整的 HTML 網頁項目&#xff0c;包含 HTML、CSS 和 JavaScript 部分&#xff0c;用于構建一個名為 “異環” 的網頁。網頁具備頭部導航欄、主體視頻展示、圖片交互元素、音樂播放控制、視頻彈窗播放以及…

Oracle表的別名不能用as,列的別名可以用as

在 Oracle 數據庫中&#xff0c;?表的別名?和?列的別名?在使用 AS 關鍵字時確實有不同規則&#xff0c;以下是詳細說明&#xff1a; 1. 表的別名&#xff08;Table Alias&#xff09;? ?不支持 AS 關鍵字?&#xff0c;直接跟在表名后即可。?語法示例?&#xff1a; S…

【SAP ME 44】在 HANA DB中報廢SFC時的SHOP_ORDER表記錄鎖定

癥狀 SELECT…FROM SHOP_ORDER FOR UPDATE 在 SFC 報廢期間持有鎖,當同時調用數量較大時,可能會導致 HANA 數據庫出現大量鎖積壓。這有時會導致因等待 HANA 數據庫釋放“選擇更新”鎖而導致報廢 SFC 花費數分鐘。 HANA 數據庫日志中的示例: # begin PreparedStatement_ex…

Vscode開發Vue項目NodeJs啟動報錯處理

文章目錄 背景一、npm啟動報錯報錯信息定位原因處理方案第一步、下載安裝高版本 二、node 無法識別報錯信息處理方案定位原因第一步、檢測環境變量第二步、重新開啟界面 背景 使用Vscode開發Vue項目&#xff0c;使用到NodeJs&#xff0c;記錄出現的問題及處理方案&#xff0c;…

破局遺留系統!AI自動化重構:從靜態方法到Spring Bean注入實戰

在當今快速發展的軟件行業中,許多企業都面臨著 Java 遺留系統的維護和升級難題。這些老舊系統往往采用了大量靜態方法,隨著業務的不斷發展,其局限性日益凸顯。而飛算 JavaAI 作為一款強大的 AI 工具,為 Java 遺留系統的重構提供了全新的解決方案,能夠實現從靜態方法到 Spring B…

2025媽媽杯數學建模C題完整分析論文(共36頁)(含模型建立、可運行代碼、數據)

2025 年第十五屆 MathorCup 數學建模C題完整分析論文 目錄 摘 要 一、問題分析 二、問題重述 三、模型假設 四、 模型建立與求解 4.1問題1 4.1.1問題1思路分析 4.1.2問題1模型建立 4.1.3問題1代碼&#xff08;僅供參考&#xff09; 4.1.4問題1求解結果&#xff08;僅…

【Python爬蟲詳解】第一篇:Python爬蟲入門指南

什么是網絡爬蟲&#xff1f; 網絡爬蟲&#xff08;Web Crawler&#xff09;是一種自動獲取網頁內容的程序。它可以訪問網站&#xff0c;抓取頁面內容&#xff0c;并從中提取有價值的數據。在信息爆炸的時代&#xff0c;爬蟲技術可以幫助我們高效地收集、整理和分析互聯網上的海…

【JavaWeb后端開發02】SpringBootWeb + Https協議

課程內容&#xff1a; SpringBootWeb 入門 Http協議 SpringBootWeb案例 分層解耦 文章目錄 1. SpringBootWeb入門1.1 概述1.2 入門程序1.2.1 需求1.2.2 開發步驟1.2.3 常見問題 1.3 入門解析 2. HTTP協議2.1 HTTP概述2.1.1 介紹2.1.2 特點 2.2 HTTP請求協議2.2.1 介紹2.2.2…

MATLAB 控制系統設計與仿真 - 37

范數魯棒控制器的設計 魯棒控制器的設計 根據雙端子狀態方程對象模型結構&#xff0c;控制器設計的目標是找到一個控制器K(s),它能保證閉環系統的范數限制在一個給定的小整數下&#xff0c;即 這時控制器的狀態方程為&#xff1a; 其中X與Y分別為下面兩個代數Riccati方程的解…

依賴沖突,缺失插件導致無法啟動項目 強制安裝命令(npm install --legacy-peer-deps)

小白終成大白 文章目錄 小白終成大白前言總結 前言 運維工程師說搞一個自動化打包流程 在服務器裝了hbuilder 找前端來啟動項目 我沒啟動起來 … 啟動報錯 failed to load config from D:\zhuque-uniapp\vite.config.js 16:17:31.601 error when starting dev server: 16:17:3…

數據戰略新范式:從中臺沉淀到服務覺醒,SQL2API 如何重塑數據價值鏈條?

一、數據中臺退燒&#xff1a;從 “戰略神話” 到 “現實拷問” 曾幾何時&#xff0c;數據中臺被視為企業數字化轉型的 “萬能解藥”&#xff0c;承載著統一數據資產、打破業務壁壘的厚望。然而&#xff0c;大量實踐暴露出其固有缺陷&#xff1a;某零售企業投入 500 萬元建設中…

警惕阿里云中的yum update操作不當導致:/sbin/init被清空導致Linux無法正常啟動

由于使用阿里云進行部署測試&#xff0c;因而會對yum update進行操作&#xff0c;這兩天更新了systemd-239-82.0.3.4.al8.2.x86_64&#xff0c;但存在報錯&#xff0c;然后進行yum history undo和清空yum cache&#xff0c;但出現操作Linux命令行無效。具體來說&#xff0c;幾個…

論文閱讀:2023 ICLR Safe RLHF: Safe Reinforcement Learning from Human Feedback

總目錄 大模型安全相關研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 Safe RLHF: Safe Reinforcement Learning from Human Feedback 安全 RLHF:通過人類反饋進行安全強化學習 https://arxiv.org/pdf/2310.12773 https://github.com/PKU-Alignment/safe…

android rom打包解包工具,Android ROM定制:boot.img、recovery解包打包

安卓boot.img和recovery.img解析與修改指南 安卓映像文件結構解析 大家都知道安卓的核心更換是在boot.img里面&#xff0c;那么如何在Windows下解開它呢&#xff1f;這里介紹一個實用的方法。 首先需要獲取bootimg.exe工具&#xff0c;這個工具最初是為華為設備開發的&#…

cdp-(Chrome DevTools Protocol) browserscan檢測原理逆向分析

https://www.browserscan.net/zh/bot-detection 首先,打開devtools后訪問網址,檢測結果網頁顯示紅色Robot,標簽插入位置,確定斷點位置可以hook該方法,也可以使用插件等方式找到這個位置,本篇不討論. Robot標簽是通過insertBefore插入的. 再往上追棧可以發現一個32長度數組,里面…

PostgreSQL 通過 copy 命令導入幾何數據 及 通過 CopyManager.copyIn() 導入幾何數據

COPY命令介紹 copy是postgresql提供的一個專門用于快速導入導出數據的命令,通常用于從文件(TXT、CSV等)或標準輸入輸出中讀取或寫入數據。適合批量導入導出數據,速度快。 默認情況下,如果在處理過程中遇到錯誤,COPY將失敗。 COPY只能用于表,不能用于視圖!!! COPY…