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>。