主题
配置与选项
在 ASP.NET Core 中,配置和选项是应用程序的核心组成部分,用于管理应用程序的运行时行为和参数。
一、配置
1.1 配置概述
ASP.NET Core 的应用程序配置通过一个或多个配置提供程序实现。这些提供程序从各种来源读取键值对形式的配置数据,并将其合并到一个统一的 IConfiguration 对象中。
可用的配置源
- 设置文件:如
appsettings.json、XML、INI 等。 - 环境变量:支持操作系统级别的环境变量。
- Azure Key Vault:用于存储敏感信息。
- Azure 应用配置:集中管理配置。
- 命令行参数:动态传递配置。
- 自定义提供程序:根据需求扩展。
- 内存中的 .NET 对象:临时配置。
默认加载顺序(优先级从高到低)
- 命令行参数。
- 非前缀环境变量。
- 用户机密(仅 Development 环境)。
appsettings.{Environment}.json文件。appsettings.json文件。- 主机配置。
注意:高优先级的配置源会覆盖低优先级的配置源。
1.2 使用
创建配置文件 appsettings.Development.json
json
{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
在控制器中可以通过依赖注入获取配置值:
csharp
[ApiController]
[Route("[controller]/[action]")]
public class WeatherForecastController : ControllerBase
{
private readonly IConfiguration _configuration;
public WeatherForecastController(IConfiguration configuration)
{
_configuration = configuration;
}
[HttpGet("GetSetting")]
public IActionResult GetSetting()
{
var myKeyValue = _configuration["MyKey"];
var title = _configuration["Position:Title"];
var name = _configuration["Position:Name"];
var defaultLogLevel = _configuration["Logging:LogLevel:Default"];
return Ok(new { MyKey = myKeyValue, Title = title, Name = name, LogLevel = defaultLogLevel });
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
二、选项模式
选项模式是一种更结构化的方式来管理配置数据,适用于需要强类型支持的场景。
2.1 选项模式概述
通过定义选项类,可以将相关配置项组织在一起,并通过依赖注入轻松访问。
优点
- 强类型支持,减少错误。
- 更清晰的代码结构。
- 支持多种生命周期管理(如实时更新)。
2.2 使用步骤
1. 添加配置节点
在 appsettings.json 中添加配置节点:
json
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}1
2
3
4
2
3
4
2. 创建选项类
定义一个强类型的选项类:
csharp
public class PositionOptions
{
public const string SectionName = "Position";
public string Title { get; set; } = string.Empty;
public string Name { get; set; } = string.Empty;
}1
2
3
4
5
6
7
2
3
4
5
6
7
3. 注册服务
创建一个扩展方法来注册选项:
csharp
public static class ConfigureExtensions
{
public static IServiceCollection AddConfigureSetup(this IServiceCollection services, IConfiguration config)
{
services.Configure<PositionOptions>(config.GetSection(PositionOptions.SectionName));
return services;
}
}1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
在 Program.cs 中注册:
csharp
builder.Services.AddConfigureSetup(builder.Configuration);1
4. 读取配置
根据需求选择合适的接口读取配置:
IOptions<TOptions>:适用于启动时读取且不更改的配置。IOptionsSnapshot<TOptions>:每次请求重新计算配置。IOptionsMonitor<TOptions>:实时监听配置变化。
示例代码:
csharp
public class WeatherForecastController : ControllerBase
{
private readonly PositionOptions _positionOptions;
public WeatherForecastController(IOptions<PositionOptions> options)
{
_positionOptions = options.Value;
}
[HttpGet("GetPosition")]
public IActionResult GetPosition()
{
return Ok(new { Title = _positionOptions.Title, Name = _positionOptions.Name });
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2.3 实时更新配置
如果需要实时更新配置,可以使用 IOptionsMonitor<TOptions>:
csharp
public class RealtimeConfigService
{
private readonly IOptionsMonitor<PositionOptions> _optionsMonitor;
public RealtimeConfigService(IOptionsMonitor<PositionOptions> optionsMonitor)
{
_optionsMonitor = optionsMonitor;
}
public PositionOptions GetCurrentOptions()
{
return _optionsMonitor.CurrentValue;
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
三、总结
配置:适合简单的键值对管理,灵活性高。选项模式:适合复杂场景,提供强类型支持和更好的结构化管理。
更多资料可查阅官方文档: