.NET 6全新配置物件ConfigurationManager介紹
介紹
本節為大家帶來.NET 6
新增的ConfigurationManager
,很多人好奇為啥要講這個,讀取載入配置資訊都隨手就來了,我們往下看一下。
翻譯:這添加了 ASP.NET Core 的新 WebApplcation
和 WebApplicationBuilder
已經使用的型別,允許從配置(例如appsettings.on
和DOTNET_/ASPNETCORE_
環境變數)中讀取,同時仍然能夠新增新的配置源,而無需顯式重建配置。每次通過IConfigurationBuilder
介面新增源時IConfiguration
,都會立即自動更新。
回顧歷史
我們在使用.NET 5
開發的時候,採用IConfigurationBuilder
Build()
構建器讀取每個配置源,並構建最終配置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(); }
當然我們正常系統開發基本上不會自己去呼叫ConfigurationBuilder
或者呼叫Build()
,這都在.Net Core底部給我們完成了。
那麼這個型別推出的意義是什麼呢?
舉個栗子Use Application ID and X.509 certificate for non-Azure-hosted apps,這是微軟官方給出的案例,我來說明一下,配置 Azure Key Vault 提供程式需要一個配置值, 那麼我是先有雞還是先有蛋呢——在構建配置之前無法新增配置源!。
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 ClientCertifioXLnUcateCredential(builtConfig["AzureADDirectoryId"],builtConfig["AzureADApplicationId"],certs.OfType<X509Certificate2>().Single()),new KeyVaultSecretManager()); store.Close(); } }) .ConfigureWebHostDefaults(webBuilder => webBuilder.UseStartup<Startup>());
我們的步驟是:
- 初始化配置
- 呼叫IConfigurationBuilder.Build()構建配置
- 從IConfigurationRoot中檢索所需的配置值
- 新增配置源
- 框架呼叫Build(),生成最終應用程式配置。
這裡我們呼叫了Build()
兩次,這會產生什麼問題呢?
ConfigurationBuilder.Build()
每次呼叫會迭代所有源,載入提供者,併產生新的例項ConfigurationRoot
.大家應該都懂讀取檔案所需的消耗吧。
新的實現
我們在使用Cohttp://www.cppcns.comnfigurationManager
時,當IConfigurationSource
新增一個AddJsonFile()
呼叫,提供程式會立即載入,並更新配置。
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
因為會任何源發生更改後必須刪除所有內容並重新開始,遍歷每個源,重新載入它們。如果你做了很多的配置源操縱的,那麼如果使用ConfigurationManager
會帶來相反的效果.
ConfigurationManager
適用於配置部分建造和、完全構建。
結語
請不要關心在使用.Net 6的時候該使用ConfigurationManager
還是ConfigurationBuilder
,在開發中根據需求去使用不同的載入方案才是最好的。
到此這篇文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援我們。