Bootstrap

Asp.Net Core 读取配置接口 IOptions、IOptionsMonitor以及IOptionsSnapshot

🍀简介

Options是.net Core Web api框架自带的功能,Options模式通过定义强类型的类来表示相关配置设置的集合,使得配置管理更为结构化和类型安全。

IOptions、IOptionsMonitor和IOptionsSnapshot是用于处理配置的依赖注入接口。这些接口允许开发者以强类型的方式访问应用的配置设置。具体分析如下:

  1. IOptions:此接口提供了对配置设置的单例访问。它在整个应用程序生命周期中保持相同的实例,这意味着即使在配置文件更改后,通过IOptions获取的值也不会改变。因此,如果需要在程序运行期间更新配置信息,则不应该使用IOptions。

  2. IOptionsMonitor:与IOptions不同,IOptionsMonitor是一个单例服务,但它可以监听配置文件的更改并自动更新其值。当文件发生更改时,它会自动重新加载配置,使得下一次访问CurrentValue属性时能够获取到最新的配置值。这种机制使得IOptionsMonitor适用于那些需要实时反映配置更改的场景。

  3. IOptionsSnapshot:IOptionsSnapshot的生命周期是作用域(Scoped),这意味着对于每一次HTTP请求,都会提供一个新的实例。如果在请求过程中配置文件发生了更改,这个实例仍然保持旧的值,直到新的请求到达,才会获取到新的配置值。因此,IOptionsSnapshot适合用在那些需要每个请求都使用最新配置快照的场景。

🐳案例

新建一个ASP.NET Core Web Application项目

首先在项目自带的appsettings.json配置文件中加入我们要添加的配置项,如下的myConfig

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "myConfig": {
    "year": 2024,
    "month": "6月",
    "name": "爱吃香蕉的阿豪"
  }
}

创建myConfig类

namespace ConfigTest;

public class MyConfig
{
    public int year { get; set; }

    public string month { get; set; }

    public string name { get; set; }
}

在Program类中配置ASP.NET Core应用程序中的依赖注入服务。使用builder.Services.Configure<T>()方法,将配置文件中名为"myConfig"的部分映射到MyConfig类的实例。这样,你可以在应用程序中使用IOptions<MyConfig>接口来访问配置信息。

builder.Services.Configure<MyConfig>(
    builder.Configuration.GetSection("myConfig"));

 新建一个Controllere,在控制器中注入了一个IOptionsSnapshot<MyConfig>类型的依赖,用于获取配置信息。

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;

namespace ConfigTest.Controllers;

[ApiController]
[Route("[controller]/[action]")]
public class GetConfigController : ControllerBase
{
    private readonly IOptionsSnapshot<MyConfig> _options;

    public GetConfigController(IOptionsSnapshot<MyConfig> options)
    {
        _options = options;
    }

    [HttpGet]
    public IActionResult GetConfig()
    {
        return Ok(_options.Value);
    }
}

 启动项目,在swagger中请求一下,成功拿到我们的配置数据

🐳其他访问配置选项的接口

🐤IOptions<TOptions>

在上面的案例中我们使用的就是IOptions,IOptions<TOptions> 是最简单的接口,它提供了一个对配置选项的访问点,这些选项在应用程序的生命周期内是静态的。一旦配置被读取,它将保持不变,除非你显式地替换它。

🐤IOptionsSnapshot<TOptions>

IOptionsSnapshot<TOptions> 在每次请求时都会创建一个选项的新实例(如果配置已更改)。它适用于那些在每个请求中可能需要不同配置值的场景。请注意,由于它在每个请求时都创建新实例,因此它可能比IOptions<TOptions>IOptionsMonitor<TOptions>开销更大。

🐤IOptionsMonitor<TOptions>

IOptionsMonitor<TOptions> 提供了对配置选项的访问,并支持选项的更改通知。当IConfiguration中的相关部分更改时,它可以触发一个回调或允许你检查选项是否已更改。

如果你想要监视配置的变化,并在配置发生变化时执行某些操作(例如重新加载缓存、发送通知等),那么应该使用IOptionsMonitor

using Microsoft.AspNetCore.Mvc;  
using Microsoft.Extensions.Options;  
  
namespace ConfigTest.Controllers;  
  
[ApiController]  
[Route("[controller]/[action]")]  
public class GetConfigController : ControllerBase  
{  
    private readonly IOptionsMonitor<MyConfig> _optionsMonitor;  
  
    public GetConfigController(IOptionsMonitor<MyConfig> optionsMonitor)  
    {  
        _optionsMonitor = optionsMonitor;  
  
        // 你可以在这里注册一个回调,当配置发生变化时执行某些操作  
        _optionsMonitor.OnChange(options =>  
        {  
            // 例如,当配置发生变化时,你可以在这里记录一条消息或重新加载缓存  
            Console.WriteLine("MyConfig has changed.");  
        });  
    }  
  
    [HttpGet]  
    public IActionResult GetConfig()  
    {  
        // 获取当前的配置值  
        return Ok(_optionsMonitor.CurrentValue);  
    }  
}

🐳注意事项

  • IOptions<TOptions> 是最简单的,并且对于大多数应用程序来说可能就足够了。
  • IOptionsMonitor<TOptions> 提供了更改通知功能,如果你需要知道配置何时更改,那么它很有用。
  • IOptionsSnapshot<TOptions> 在每个请求时都会重新评估配置,这可能会带来一些性能开销,但如果你需要在每个请求中使用不同的配置值,那么它很有用。
;