ConfigurationBuilder详解

发布时间:2023-05-18

一、ConfigurationBuilder简介

ConfigurationBuilder是.NET中的一个类库,用于读取和处理应用程序的配置文件。它是一个非常实用的工具,可以帮助开发人员轻松地管理应用程序的配置信息。ConfigurationBuilder提供了一种简单的方式来读取和访问应用程序配置信息,这使得开发人员能够更快速和高效地开发应用程序。 ConfigurationBuilder旨在帮助开发人员读取和管理配置文件。它提供了一种集成的方式来访问应用程序的配置文件,允许“覆盖”和“合并”配置来管理应用程序的不同环境。ConfigurationBuilder允许开发人员从不同源读取配置信息,包括JSON、XML、环境变量等,并使用.NET的强类型化对象模型处理这些配置信息。 ConfigurationBuilder是ASP.NET Core 项目默认使用的一种方式来加载配置文件,并可以轻松扩展以支持更多自定义的配置。

二、ConfigurationBuilder的使用

1、读取显式配置文件

ConfigurationBuilder可以直接读取配置文件,也可以从不同的源来读取配置信息,例如环境变量等。现在我们来看一个例子,这里我们使用默认的配置文件appsettings.json

using Microsoft.Extensions.Configuration;
using System.IO;
public class ConfigTest
{
    public static void Main(string[] args)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
        IConfigurationRoot configuration = builder.Build();
        // 通过键获取值
        string connString = configuration.GetConnectionString("DefaultConnection");
    }
}

上面的代码读取了appsettings.json文件并将其解析为一个IConfigurationRoot实例。我们可以通过调用GetConnectionString方法来获取配置文件中的连接字符串。 这里“DefaultConnection”是我们在appsettings.json文件中设置的连接字符串的名称,可以是任何自定义名称。

2、读取多个配置文件

除了读取单个配置文件之外,ConfigurationBuilder还允许读取多个配置文件并将它们合并为一个IConfiguration实例。 下面的示例演示如何加载多个JSON文件:

var builder = new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
    .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
IConfigurationRoot configuration = builder.Build();

该示例先读取appsettings.json文件,然后读取与当前环境文件名匹配的配置文件。这里使用了环境名称,例如,如果当前的环境名称为 “Production”,则将读取 appsettings.Production.json 文件。

3、使用环境变量

ConfigurationBuilder还允许开发人员使用环境变量来管理配置信息。可以将环境变量视为动态配置文件,它们可以在应用程序运行时更改。 下面的示例演示如何使用环境变量来指定默认连接字符串:

var builder = new ConfigurationBuilder();
builder.AddEnvironmentVariables();
var config = builder.Build();
string connString = config["DefaultConnection"];

这里AddEnvironmentVariables方法加载了所有的操作系统环境变量,并将它们合并到 IConfiguration 对象中。接下来,我们可以使用Get方法来获取指定键的值。

4、使用自定义配置提供程序

ConfigurationBuilder允许开发人员编写自定义的配置提供程序以扩展其功能。例如,我们可以编写自定义配置提供程序来从数据库中读取配置信息,而不是从文件中读取。 下面的示例演示如何使用自定义配置提供程序:

var builder = new ConfigurationBuilder()
    .AddMyCustomProvider();
var config = builder.Build();
string value = config["key"];

这里我们调用自定义提供程序AddMyCustomProvider(),然后使用Build()方法创建一个IConfigurationRoot实例。最后使用simpleKey来获取配置值。

5、使用密钥和秘密管理器

ConfigurationBuilder还提供了一种简单的方式来管理应用程序中的加密数据。它提供了一个扩展点,允许开发人员在配置文件中使用加密后的敏感信息,同时仍然可以轻松地解密。 下面的示例演示如何使用密钥和密钥管理器:

var builder = new ConfigurationBuilder();
builder.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
builder.AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true);
builder.AddUserSecrets<Program>();
builder.AddEnvironmentVariables();
var config = builder.Build();
string connString = config.GetConnectionString("DefaultConnection");

在这里,我们调用AddUserSecrets()方法来添加用户秘密,然后使用IConfigurationGetConnectionString()方法来获取连接字符串。

三、ConfigurationBuilder的扩展

ConfigurationBuilder提供了许多扩展后的第三方插件,可以轻松地扩展其功能,例如读取和写入其他配置文件格式,或者在多种配置来源之间进行转换。

1、如何使用YAML配置文件

除了支持常规的 JSON 和 XML 配置文件之外,也可以使用第三方插件支持从 YAML 文件获取配置信息。 下面的示例演示如何使用Kralizek.Extensions.Configuration来读取YAML文件:

using Kralizek.Extensions.Configuration;
public class ConfigTest
{
    public static void Main(string[] args)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddYamlFile("appsettings.yaml", optional: true, reloadOnChange: true);
        IConfigurationRoot configuration = builder.Build();
        // 通过键获取值
        string connString = configuration.GetConnectionString("DefaultConnection");
    }
}

在这里我们使用AddYamlFile()方法来从YAML文件中读取配置信息。

2、如何使用INI配置文件

与YAML一样,ConfigurationBuilder还提供了第三方插件,允许我们使用INI格式的配置文件。 下面的示例演示如何使用KLDotNetCore.INIConfiguration来读取INI文件:

using KLDotNetCore.INIConfiguration;
public class ConfigTest
{
    public static void Main(string[] args)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddINIFile("appsettings.ini", optional: true, reloadOnChange: true);
        IConfigurationRoot configuration = builder.Build();
        // 通过键获取值
        string connString = configuration.GetConnectionString("DefaultConnection");
    }
}

在这里我们使用AddINIFile()方法来从INI文件中读取配置信息。

3、如何使用Environment变量配置

在上述例子中,我们使用AddEnvironmentVariables()方法从操作系统的环境变量中读取配置信息。环境变量本身具有高度的可配置性,可以在多个操作系统上轻松地设置为各种值。 下面的例子演示了如何使用第三方插件QuickenLoans.Configuration进行配置:

using QuickenLoans.Configuration;
public class ConfigTest
{
    public static void Main(string[] args)
    {
        var builder = new ConfigurationBuilder()
            .AddEnvironmentVariables("my_")
            .AddEnvironmentVariables("MY_")
            .AddEnvironmentVariables("My_");
        IConfigurationRoot configuration = builder.Build();
        // 通过键获取值
        string connString = configuration.GetConnectionString("DefaultConnection");
    }
}

在这里,我们使用AddEnvironmentVariables方法,但是在参数上使用前缀。这允许我们只选择以指定前缀开头的环境变量。