一、什么是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。