Skip to content

配置与选项

在 ASP.NET Core 中,配置和选项是应用程序的核心组成部分,用于管理应用程序的运行时行为和参数。


一、配置

1.1 配置概述

ASP.NET Core 的应用程序配置通过一个或多个配置提供程序实现。这些提供程序从各种来源读取键值对形式的配置数据,并将其合并到一个统一的 IConfiguration 对象中。

可用的配置源

  • 设置文件:如 appsettings.json、XML、INI 等。
  • 环境变量:支持操作系统级别的环境变量。
  • Azure Key Vault:用于存储敏感信息。
  • Azure 应用配置:集中管理配置。
  • 命令行参数:动态传递配置。
  • 自定义提供程序:根据需求扩展。
  • 内存中的 .NET 对象:临时配置。

默认加载顺序(优先级从高到低)

  1. 命令行参数。
  2. 非前缀环境变量。
  3. 用户机密(仅 Development 环境)。
  4. appsettings.{Environment}.json 文件。
  5. appsettings.json 文件。
  6. 主机配置。

注意:高优先级的配置源会覆盖低优先级的配置源。


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": "*"
}

在控制器中可以通过依赖注入获取配置值:

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 });
    }
}

二、选项模式

选项模式是一种更结构化的方式来管理配置数据,适用于需要强类型支持的场景。


2.1 选项模式概述

通过定义选项类,可以将相关配置项组织在一起,并通过依赖注入轻松访问。

优点

  • 强类型支持,减少错误。
  • 更清晰的代码结构。
  • 支持多种生命周期管理(如实时更新)。

2.2 使用步骤

1. 添加配置节点

appsettings.json 中添加配置节点:

json
"Position": {
    "Title": "Editor",
    "Name": "Joe Smith"
}

2. 创建选项类

定义一个强类型的选项类:

csharp
public class PositionOptions
{
    public const string SectionName = "Position";

    public string Title { get; set; } = string.Empty;
    public string Name { get; set; } = string.Empty;
}

3. 注册服务

创建一个扩展方法来注册选项:

csharp
public static class ConfigureExtensions
{
    public static IServiceCollection AddConfigureSetup(this IServiceCollection services, IConfiguration config)
    {
        services.Configure<PositionOptions>(config.GetSection(PositionOptions.SectionName));
        return services;
    }
}

Program.cs 中注册:

csharp
builder.Services.AddConfigureSetup(builder.Configuration);

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 });
    }
}

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;
    }
}

三、总结

  • 配置:适合简单的键值对管理,灵活性高。
  • 选项模式:适合复杂场景,提供强类型支持和更好的结构化管理。

更多资料可查阅官方文档:

最近更新