• 浅讲.Net 6之ConfigurationManager


    介绍

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

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

    我们的步骤是:

    • 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,在开发中根据需求去使用不同的加载方案才是最好的。

    另我的分布式事务实现代码目前接近尾声,后面会给大家带来文章讲解

    最后欢迎各位读者关注我的博客, https://github.com/MrChuJiu/Dppt/tree/master/src 欢迎大家Star

    联系作者:加群:867095512 @MrChuJiu

  • 相关阅读:
    4
    3
    iOS常用的三种支付方式
    iOS开发技术之银联支付
    iOS开发技术之支付宝支付
    iOS开发技术之微信支付
    Subversion使用总结
    如何在已有 Xcode 项目中 加入Cordova框架(或者称PhoneGap框架)进行iOS移动跨平台开发
    iOS开发中Masonry的使用总结:
    iOS开发中的权限适配问题总结
  • 原文地址:https://www.cnblogs.com/MrChuJiu/p/15591837.html
Copyright © 2020-2023  润新知