.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 | ✅ | ✅ | ✅ |
留待后查,同时方便他人
联系我:ivesbao@163.com
联系我:ivesbao@163.com

浙公网安备 33010602011771号