.NET?6全新配置對(duì)象ConfigurationManager介紹
介紹
本節(jié)為大家?guī)?lái).NET 6
新增的ConfigurationManager
,很多人好奇為啥要講這個(gè),讀取加載配置信息都隨手就來(lái)了,我們往下看一下。
翻譯:這添加了 ASP.NET Core 的新 WebApplcation
和 WebApplicationBuilder
已經(jīng)使用的類(lèi)型,允許從配置(例如appsettings.json
和DOTNET_/ASPNETCORE_
環(huán)境變量)中讀取,同時(shí)仍然能夠添加新的配置源,而無(wú)需顯式重建配置。每次通過(guò)IConfigurationBuilder
界面添加源時(shí)IConfiguration
,都會(huì)立即自動(dòng)更新。
回顧歷史
我們?cè)谑褂?code>.NET 5開(kāi)發(fā)的時(shí)候,采用IConfigurationBuilder
添加配置源。調(diào)用Build()
構(gòu)建器讀取每個(gè)配置源,并構(gòu)建最終配置IConfigurationRoot
。
private static IConfigurationRoot BuildConfiguration() { var builder = new ConfigurationBuilder() .SetBasePath(Path.Combine(Directory.GetCurrentDirectory(), "../MyCompanyName.MyProjectName.DbMigrator/")) .AddJsonFile("appsettings.json", optional: false); return builder.Build(); }
當(dāng)然我們正常系統(tǒng)開(kāi)發(fā)基本上不會(huì)自己去調(diào)用ConfigurationBuilder
或者調(diào)用Build()
,這都在.Net Core底部給我們完成了。
那么這個(gè)類(lèi)型推出的意義是什么呢?
舉個(gè)栗子Use Application ID and X.509 certificate for non-Azure-hosted apps,這是微軟官方給出的案例,我來(lái)說(shuō)明一下,配置 Azure Key Vault 提供程序需要一個(gè)配置值, 那么我是先有雞還是先有蛋呢——在構(gòu)建配置之前無(wú)法添加配置源!。
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureAppConfiguration((context, config) => { if (context.HostingEnvironment.IsProduction()) { var builtConfig = config.Build(); using var store = new X509Store(StoreLocation.CurrentUser); store.Open(OpenFlags.ReadOnly); var certs = store.Certificates.Find( X509FindType.FindByThumbprint, builtConfig["AzureADCertThumbprint"], false); config.AddAzureKeyVault(new Uri($"https://{builtConfig["KeyVaultName"]}.vault.azure.net/"), new ClientCertificateCredential(builtConfig["AzureADDirectoryId"], builtConfig["AzureADApplicationId"], certs.OfType<X509Certificate2>().Single()), new KeyVaultSecretManager()); store.Close(); } }) .ConfigureWebHostDefaults(webBuilder => webBuilder.UseStartup<Startup>());
我們的步驟是:
- 初始化配置
- 調(diào)用IConfigurationBuilder.Build()構(gòu)建配置
- 從IConfigurationRoot中檢索所需的配置值
- 添加配置源
- 框架調(diào)用Build(),生成最終應(yīng)用程序配置。
這里我們調(diào)用了Build()
兩次,這會(huì)產(chǎn)生什么問(wèn)題呢?
ConfigurationBuilder.Build()
每次調(diào)用會(huì)迭代所有源,加載提供者,并產(chǎn)生新的實(shí)例ConfigurationRoot
.大家應(yīng)該都懂讀取文件所需的消耗吧。
新的實(shí)現(xiàn)
我們?cè)谑褂?code>ConfigurationManager時(shí),當(dāng)IConfigurationSource
添加一個(gè)AddJsonFile()
調(diào)用,提供程序會(huì)立即加載,并更新配置。
using var config = new ConfigurationManager(); config.AddEnvironmentVariables(prefix: "MyCustomPrefix_"); if (config["FileConfig"] == "enabled") { config.AddJsonFile("MyConfig.json", optional: true, reloadOnChange: true); } string myValueFromJson = config["JsonConfigValue"]; public class ConfigurationManager { private void AddSource(IConfigurationSource source) { lock (_providerLock) { IConfigurationProvider provider = source.Build(this); _providers.Add(provider); provider.Load(); _changeTokenRegistrations.Add(ChangeToken.OnChange(() => provider.GetReloadToken(), () => RaiseChanged())); } RaiseChanged(); } } private void ReloadSources() { lock (_providerLock) { DisposeRegistrationsAndProvidersUnsynchronized(); _changeTokenRegistrations.Clear(); _providers.Clear(); foreach (var source in _sources) { _providers.Add(source.Build(this)); } foreach (var p in _providers) { p.Load(); _changeTokenRegistrations.Add(ChangeToken.OnChange(() => p.GetReloadToken(), () => RaiseChanged())); } } RaiseChanged(); }
注意:ConfigurationManager
因?yàn)闀?huì)任何源發(fā)生更改后必須刪除所有內(nèi)容并重新開(kāi)始,遍歷每個(gè)源,重新加載它們。如果你做了很多的配置源操縱的,那么如果使用ConfigurationManager
會(huì)帶來(lái)相反的效果.
ConfigurationManager
適用于配置部分建造和、完全構(gòu)建。
結(jié)語(yǔ)
請(qǐng)不要關(guān)心在使用.Net 6的時(shí)候該使用ConfigurationManager
還是ConfigurationBuilder
,在開(kāi)發(fā)中根據(jù)需求去使用不同的加載方案才是最好的。
到此這篇文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
.Net行為型設(shè)計(jì)模式之觀察者模式(Observer)
這篇文章介紹了.Net行為型設(shè)計(jì)模式之觀察者模式(Observer),文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05ASP.NET中 RadioButtonList 單選按鈕組控件的使用方法
本文主要簡(jiǎn)單介紹RadioButtonList控件的常見(jiàn)屬性和使用方法,希望對(duì)大家有所幫助。2016-04-04ASP.NET中 ObjectDataSource控件的DataObjectTypeName屬性
本文主要介紹ObjectDataSource控件和DataObjectTypeName屬性的用法,希望能給小伙伴們一些幫助。2016-04-04一步步打造漂亮的新聞列表(無(wú)刷新分頁(yè)、內(nèi)容預(yù)覽)第二步
由于我們僅僅是項(xiàng)目中的一個(gè)小部分,但也差不多按照以上的順序進(jìn)行開(kāi)發(fā),這是一個(gè)良好的習(xí)慣。我們將概要設(shè)計(jì)和詳細(xì)設(shè)計(jì)放在一起。2010-07-07初識(shí) ASP.NET Membership 用戶(hù)管理
Membership 是用做用戶(hù)管理,進(jìn)行身份認(rèn)證使用的。通過(guò)ASP.NET Membership,我們可以創(chuàng)建用戶(hù)、刪除用戶(hù)和編輯用戶(hù)屬性。所以這是一個(gè)實(shí)現(xiàn)登錄相關(guān)控件的底層框架。2016-04-04.Net Core使用SignalR實(shí)現(xiàn)斗地主游戲
本文詳細(xì)講解了.Net Core使用SignalR實(shí)現(xiàn)斗地主游戲的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01asp.net下SQLite(輕量級(jí)最佳數(shù)據(jù)庫(kù)) 原理分析和開(kāi)發(fā)應(yīng)用
SQLite是一個(gè)開(kāi)源的嵌入式關(guān)系數(shù)據(jù)庫(kù),它在2000年由D. Richard Hipp發(fā)布,它的減少應(yīng)用程序管理數(shù)據(jù)的開(kāi)銷(xiāo),SQLite可移植性好,很容易使用,很小,高效而且可靠2011-10-10ASP.NET Core基礎(chǔ)之啟動(dòng)設(shè)置
這篇文章介紹了ASP.NET Core基礎(chǔ)之啟動(dòng)設(shè)置,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-02-02