淺講.Net 6之ConfigurationManager
介紹
本節為大家帶來.NET 6
新增的ConfigurationManager
,很多人好奇為啥要講這個,讀取載入配置資訊都隨手就來了,我們往下看一下。
翻譯:這添加了 ASP.NET Core 的新 WebApplcation 和 WebApplicationBuilder已經使用的類型,允許從配置(例如appsettings.json和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($"//{builtConfig["KeyVaultName"]}.vault.azure.net/"),
new ClientCertificateCredential(builtConfig["AzureADDirectoryId"], builtConfig["AzureADApplicationId"], certs.OfType<X509Certificate2>().Single()),
new KeyVaultSecretManager());
store.Close();
}
})
.ConfigureWebHostDefaults(webBuilder => webBuilder.UseStartup<Startup>());
我們的步驟是:
- 1.初始化配置
- 2.調用
IConfigurationBuilder.Build()
構建配置 - 3.從
IConfigurationRoot
中檢索所需的配置值 - 4.添加配置源
- 5.框架調用
Build()
,生成最終應用程式配置。
這裡我們調用了Build()兩次,這會產生什麼問題呢?
ConfigurationBuilder.Build()
每次調用會迭代所有源,載入提供者,併產生新的實例ConfigurationRoot
.大家應該都懂讀取文件所需的消耗吧。
新的實現
我們在使用ConfigurationManager
時,當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,在開發中根據需求去使用不同的載入方案才是最好的。
另我的分散式事務實現程式碼目前接近尾聲,後面會給大家帶來文章講解
最後歡迎各位讀者關注我的部落格, //github.com/MrChuJiu/Dppt/tree/master/src 歡迎大家Star
聯繫作者:加群:867095512 @MrChuJiu