.NET 6全新配置对象ConfigurationManager介绍

2022-04-15 20:52:05

介绍

本节为大家带来.NET 6新增的ConfigurationManager,很多人好奇为啥要讲这个,读取加载配置信息都随手就来了,我们往下看一下。

是先有蛋呢——在构建配置之前无法添加配置源!。

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>());

我们的步骤是:

FskXKfdlWH 初始化配置 调用IConfigurationBuilder.Build()构建配置 从IConfigurationRoot中检索所需的配置值 添加配置源 框架调用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,在开发中根据需求去使用不同的加载方案才是最好的。

到此这篇文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。