您的位置:

详解IConfiguration

一、什么是IConfiguration

IConfiguration是ASP.NET Core中高度可配置和灵活的机制之一。它允许我们在应用程序中方便地读取和使用各种配置数据。当我们使用ASP.NET Core时,我们通常需要读取配置数据,例如数据库连接字符串、API密钥,以及其他应用程序的设置。IConfiguration接口读取和展示一组键值对配置。

我们可以使用IConfiguration在整个应用程序中提供各种值。这包括appsettings.json文件中的值,环境变量,命令行参数,甚至是用户定义配置源。

二、怎样使用IConfiguration

1. 读取appsettings.json文件中的数据

<configuration>
  <appSettings file="appsettings.json">
  ...
  </appSettings>
</configuration>

使用以下代码读取appsettings.json文件中的数据:

var builder = new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("appsettings.json");

var configuration = builder.Build();

var database = configuration["Database"];
var connectionstring = configuration.GetConnectionString("DefaultConnection");

通过AddJsonFile()方法,我们可以告诉IConfigurationBuilder在哪里查找appsettings.json文件。当调用Build()完成后,我们就可以使用它的索引器方法来读取特定的键。

2. 添加/覆盖appsettings.json配置文件内容的方式

我们可以使用AddJsonFile()方法添加或覆盖appsettings.json配置文件内容。这非常有用,因为在不同环境中,可能需要使用不同的配置值。

例如,在appsettings.json中,我们可能有以下内容:

{
    "Logging": {
        "LogLevel": {
            "Default": "Warning",
            "System": "Information",
            "Microsoft": "Information"
        }
    },
    "AllowedHosts": "*"
}

我们可以在Program.cs中使用以下代码覆盖AllowedHosts:

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration(builder =>
        {
            builder.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                .AddCommandLine(args);
        })
        .ConfigureLogging(logging =>
        {
            logging.ClearProviders();
            logging.AddConsole();
            logging.AddDebug();
        })
        .UseStartup<Startup>();

在上述代码中,我们向配置中添加了命令行参数,但是参数需要以两个破折号“--”开头。例如:

dotnet app.dll --AllowedHosts="localhost;www.xyz.com"

这将会添加一个名为AllowedHosts的字典项到IConfiguration对象中,该项的值为“localhost;www.xyz.com”。

3. 读取User Secrets中的数据

UserSecrets是一个命名约定,它允许我们将不同的数据存储在开发环境下的本地计算机上。

我们可以使用以下代码读取User Secrets中的数据:

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration(builder =>
        {
            builder.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                .AddUserSecrets<Program>()
                .AddEnvironmentVariables()
                .AddCommandLine(args);
        })
        .ConfigureLogging(logging =>
        {
            logging.ClearProviders();
            logging.AddConsole();
            logging.AddDebug();
        })
        .UseStartup<Startup>();

在上述代码中,我们通过调用AddUserSecrets()方法将User Secrets添加到配置中。

4. 使用自定义配置源

我们可以实现IConfigurationSource,以实现自定义配置源,以自己的方式读取/解析特定类型的配置到IConfiguration对象中。

例如,我们需要从数据库中读取一些应用程序的配置。 我们可以创建以下类:

public class DatabaseConfigurationSource : IConfigurationSource
{
    private readonly string _connectionString;

    public DatabaseConfigurationSource(string connectionString)
    {
        _connectionString = connectionString;
    }

    public IConfigurationProvider Build(IConfigurationBuilder builder)
    {
        return new DatabaseConfigurationProvider(_connectionString);
    }
}

public class DatabaseConfigurationProvider : ConfigurationProvider
{
    public DatabaseConfigurationProvider(string connectionString)
    {
        // read data from database using connectionString
        // example: Get a list of all IDs and Values from your Configuration table

        var dataFromDatabase = new Dictionary<string, string>()
        {
            {"ConfigId1", "ConfigValue1"},
            {"ConfigId2", "ConfigValue2"},
            {"ConfigId3", "ConfigValue3"}
        };

        // Set Data in the Configuration Provider
        Data = dataFromDatabase;
    }
}

我们现在可以在启动应用程序时构建此类的实例。

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration(builder =>
        {
            builder.Add(new DatabaseConfigurationSource("[connectionString]"))
                .AddEnvironmentVariables()
                .AddCommandLine(args)
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
        })
        .ConfigureLogging(logging =>
        {
            logging.ClearProviders();
            logging.AddConsole();
            logging.AddDebug();
        })
        .UseStartup<Startup>()
        .Build();

三、总结

在这篇文章中,我们详细阐述了IConfiguration的使用方式。我们可以使用它来读取appsettings.json文件中的数据,添加和覆盖配置数据,读取用户或开发者secrets中的数据,以及使用自定义配置源。希望这篇文章能够帮助您更好地理解和使用IConfiguration。