.net IOptions

IOptions

一、版本支持总览

Options Pattern 来自 Microsoft.Extensions.Options,随 ASP.NET Core / .NET 通用主机体系发展:

接口 最早可用 说明
IOptions<T> .NET Core 1.0 一开始就有
IOptionsSnapshot<T> .NET Core 2.0 为 Web 请求/Scoped 场景加入
IOptionsMonitor<T> .NET Core 2.0(正式) 1.0 前曾出现在 RC 中,RTM 后 2.0 正式提供
AddOptions().BindConfiguration() .NET 7 比 Configure + GetSection 更简洁
ValidateOnStart() .NET 6+ 强化,现代项目常用 启动时校验配置

✅ 现在:.NET Core 2.0+ / .NET 5 / 6 / 7 / 8 / 9 / 10 全部支持这三个接口
✅ 老 .NET Framework 4.6.2+ 也可通过 NuGet 包 Microsoft.Extensions.Options 使用


二、IOptions<T>

  • 出现版本:.NET Core 1.0
  • 生命周期:Singleton
  • 行为:应用启动时绑定一次,之后不跟着 appsettings.json 变
services.Configure<MyConfig>(Configuration.GetSection("MyConfig"));

public class A
{
    private readonly MyConfig _c;
    public A(IOptions<MyConfig> o) => _c = o.Value;
}

适用:连接串、密钥、应用名等“部署后基本不变”的配置


三、IOptionsSnapshot<T>

  • 出现版本:.NET Core 2.0
  • 生命周期:Scoped
  • 行为:每个请求/作用域重新读配置,请求内一致
public class Ctrl : ControllerBase
{
    public Ctrl(IOptionsSnapshot<MyConfig> o)
    {
        var c = o.Value;
        var stripe = o.Get("Stripe"); // 命名配置
    }
}

适用:ASP.NET Core 控制器 / Razor 页面,配置可能改、但不要“一次请求里变两次”

⚠️ 不能注入到 Singleton 服务(作用域冲突)


四、IOptionsMonitor<T>

  • 出现版本:.NET Core 2.0(正式)
  • 生命周期:Singleton
  • 行为:实时跟配置源走,支持 CurrentValue 和 OnChange
public class Worker : IHostedService
{
    public Worker(IOptionsMonitor<MyConfig> m)
    {
        var c = m.CurrentValue;
        m.OnChange(cfg => Console.WriteLine("配置变了:" + cfg.Version));
    }
}

适用:

  • 后台服务 / Hosted Service
  • 单例服务
  • 功能开关、限流、动态参数
  • 需要“配置一改,代码立刻知道”

五、注册方式演变(版本相关)

老写法(Core 1.x / 2.x 到现在都能用)

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

.NET 7+ 推荐写法

services.AddOptions<MyConfig>()
       .BindConfiguration("MyConfig")
       .ValidateDataAnnotations()
       .ValidateOnStart();

功能一样,后者链式更干净。


六、速查表

项目 IOptions IOptionsSnapshot IOptionsMonitor
最低版本 Core 1.0 Core 2.0 Core 2.0
生命周期 Singleton Scoped Singleton
热更新 ❌ ✅ 每请求 ✅ 实时
命名配置 ❌ ✅ ✅
变化通知 ❌ ❌ ✅ OnChange
注入到 Singleton ✅ ❌ ✅
注入到 Controller ✅ ✅ ✅
posted @ 2026-09-22 14:50  Hey,Coder!  阅读(5)  评论(0)    收藏  举报