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

 更新时间:2021年11月23日 16:21:34   作者:初久的私房菜  
这篇文章介绍了.NET 6全新配置对象ConfigurationManager,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

介绍

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

翻译:这添加了 ASP.NET Core 的新 WebApplcation WebApplicationBuilder已经使用的类型,允许从配置(例如appsettings.jsonDOTNET_/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,在开发中根据需求去使用不同的加载方案才是最好的。

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

相关文章

  • ASP.NET中ImageButton图片按钮控件的使用

    ASP.NET中ImageButton图片按钮控件的使用

    本文主要介绍ImageButton控件的基础使用方法,该控件类似Button控件,但又比Button丰富,下面看它的具体使用。
    2016-04-04
  • Asp.net基础知识扫盲篇

    Asp.net基础知识扫盲篇

    这篇文章主要介绍了Asp.net基础知识扫盲篇与问答篇对想了解asp.net的朋友应该有所帮助
    2021-05-05
  • 简单的启动窗体

    简单的启动窗体

    简单的启动窗体...
    2006-10-10
  • .Net行为型设计模式之观察者模式(Observer)

    .Net行为型设计模式之观察者模式(Observer)

    这篇文章介绍了.Net行为型设计模式之观察者模式(Observer),文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • C#声明方法实例说明

    C#声明方法实例说明

    方法(Method)是一个已命名的语句集。如果以前使用过其他编程语言,如C或Visual Basic等,就可以将方法视为函数或者子程序相似的东西。每个方法都有一个名称和一个主体。方法名应该是一个有意义的标识符,它应描述出方法的用途(如CalculateIncomeTax)。方法主体包含了调用方法时实际执行的语句。你可以为大多数方法提供一些数据来进行处理,并让它返回一些信息(通常是处理结果)。方法是一种基本的、功能强大的编程机制。
    2008-04-04
  • ASP.NET中HttpContext对象下的属性介绍

    ASP.NET中HttpContext对象下的属性介绍

    这篇文章介绍了ASP.NET中HttpContext对象下的属性,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • WPF引用MVVM框架与使用方法

    WPF引用MVVM框架与使用方法

    这篇文章介绍了WPF引用MVVM框架与使用方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-01-01
  • VisualStudio 2008中常用快捷键

    VisualStudio 2008中常用快捷键

    Visual Studio中的菜单很多,二级菜单也有不少,为了方便还是记点快捷键,既方便又迅速。
    2009-09-09
  • 搭建基础结构的ABP解决方案介绍

    搭建基础结构的ABP解决方案介绍

    这篇文章介绍了搭建基础结构的ABP解决方案的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • .Net创建型设计模式之建造者、生成器模式(Builder)

    .Net创建型设计模式之建造者、生成器模式(Builder)

    这篇文章介绍了.Net设计模式之建造者、生成器模式(Builder),文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05

最新评论