🍀简介
Options是.net Core Web api框架自带的功能,Options模式通过定义强类型的类来表示相关配置设置的集合,使得配置管理更为结构化和类型安全。
IOptions、IOptionsMonitor和IOptionsSnapshot是用于处理配置的依赖注入接口。这些接口允许开发者以强类型的方式访问应用的配置设置。具体分析如下:
-
IOptions:此接口提供了对配置设置的单例访问。它在整个应用程序生命周期中保持相同的实例,这意味着即使在配置文件更改后,通过IOptions获取的值也不会改变。因此,如果需要在程序运行期间更新配置信息,则不应该使用IOptions。
-
IOptionsMonitor:与IOptions不同,IOptionsMonitor是一个单例服务,但它可以监听配置文件的更改并自动更新其值。当文件发生更改时,它会自动重新加载配置,使得下一次访问CurrentValue属性时能够获取到最新的配置值。这种机制使得IOptionsMonitor适用于那些需要实时反映配置更改的场景。
-
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>
在每个请求时都会重新评估配置,这可能会带来一些性能开销,但如果你需要在每个请求中使用不同的配置值,那么它很有用。