怪奇物语

怪奇物语

首页 新随笔 联系 管理

appsettings.json,配置变更,自动感知,Configure<T>(...) + IOptions<T>/IOptionsSnapshot<T>/IOptionsMonitor<T>

Configure<T>(...) + IOptions<T>/IOptionsSnapshot<T>/IOptionsMonitor<T>

1 IOptions<T>

  • 特点:和单例类似,启动时读取一次,之后不变。
  • 配置变更不支持

2 IOptionsSnapshot<T>

  • 特点:每次创建新的作用域(如每个 HTTP 请求)时,都会重新读取配置。
  • 配置变更支持,但只在新作用域生效(适合 Web 应用)。

3 IOptionsMonitor<T>

  • 特点:支持实时监听配置变更,配置文件变更后会自动更新注入的配置对象。
  • 配置变更支持,适合后台服务、长期运行的单例等。

示例代码

注册

collection.Configure<FTPSettings>(configurationRoot.GetSection("FTPSettings"));

使用 IOptionsMonitor<T>

using Microsoft.Extensions.Options;

public class MyService
{
    //               👇👇👇👇👇👇👇👇👇👇👇
    private readonly IOptionsMonitor<FTPSettings> _settingsMonitor;
    public MyService(IOptionsMonitor<FTPSettings> settingsMonitor)
    {
        _settingsMonitor = settingsMonitor;
        _settingsMonitor.OnChange(settings => {
            // 配置变更时自动触发
            Console.WriteLine("FTP配置已变更: " + settings.Host);
        });
    }
    public void DoWork()
    {
        var settings = _settingsMonitor.CurrentValue;
        // 每次获取都是最新配置
    }
}

使用 IOptionsSnapshot<T>

public class MyScopedService
{
    //               👇👇👇👇👇👇👇👇👇👇👇👇👇👇
    private readonly FTPSettings _settings;
    public MyScopedService(IOptionsSnapshot<FTPSettings> options)
    {
        _settings = options.Value;
    }
    // 每次作用域(如Web请求)获取到的配置是最新的
}

对比总结

方式 是否支持配置变更 适用场景 备注
AddSingleton(Get<T>()) 简单单例 启动时固定
Configure<T>() + IOptions<T> 单例/后台服务 启动时固定
Configure<T>() + IOptionsSnapshot<T> 是(新作用域) Web请求作用域 每次请求获取最新配置
Configure<T>() + IOptionsMonitor<T> 是(实时) 单例/后台服务 支持 OnChange 事件和热更新

结论

  • 需要配置热更新:推荐用 Configure<T>() + IOptionsMonitor<T>
  • Web请求作用域配置:用 IOptionsSnapshot<T>
  • 只需启动时读取一次:用 AddSingleton(Get<T>())IOptions<T>
posted on 2025-07-05 08:00  超级无敌美少男战士  阅读(20)  评论(0)    收藏  举报