Asp.Net Core 读取配置接口 IOptions、IOptionsMonitor以及IOptionsSnapshot

🍀简介

Options是.net Core Web api框架自带的功能,Options模式通过定义强类型的类来表示相关配置设置的集合,使得配置管理更为结构化和类型安全。

IOptions、IOptionsMonitor和IOptionsSnapshot是用于处理配置的依赖注入接口。这些接口允许开发者以强类型的方式访问应用的配置设置。具体分析如下:

  1. IOptions:此接口提供了对配置设置的单例访问。它在整个应用程序生命周期中保持相同的实例,这意味着即使在配置文件更改后,通过IOptions获取的值也不会改变。因此,如果需要在程序运行期间更新配置信息,则不应该使用IOptions。

  2. IOptionsMonitor:与IOptions不同,IOptionsMonitor是一个单例服务,但它可以监听配置文件的更改并自动更新其值。当文件发生更改时,它会自动重新加载配置,使得下一次访问CurrentValue属性时能够获取到最新的配置值。这种机制使得IOptionsMonitor适用于那些需要实时反映配置更改的场景。

  3. 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> 在每个请求时都会重新评估配置,这可能会带来一些性能开销,但如果你需要在每个请求中使用不同的配置值,那么它很有用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1452652.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

给Windows软件添加异常捕获模块生成dump文件(附源码)

软件在运行过程中会时常发生内存越界、内存访问为例、stack overflow线程栈溢出、空指针与野指针等异常崩溃,仅仅是依靠Debug和Release下的调试是远远不够的,因为有些崩溃不是必现的,或者是Debug下很难出现的。所以我们需要在软件中添加异常捕获的模块,在捕获到异常时生成包…

带侧边栏布局:带导航的网页

目录 任务描述 相关知识 HTML(HyperText Markup Language) CSS&#xff08;Cascading Style Sheets&#xff09;&#xff1a; 编程要求 任务描述 在本关中&#xff0c;你的任务是创建一个带侧边栏和导航的网页布局。这种布局通常用于网站或应用程序&#xff0c;其中侧边栏…

Mssql数据注入

1.查询用户创建的数据表 select id,name from sysobjects where xtypeu ; 2.查询用户创建数据表的具体列名 select * from syscolumns where id 上一步获取的id值; 3.查询具体内容 select id,字段名 from 数据表名&#xff1b; 4.数据库名 db_name() 5.用户登录名 su…

从大量文本中挖掘‘典型意见‘-基于DBSCAN的文本聚类实战

文本聚类,是一个无监督学习里面非常重要的课题,无论是在风控还是在其他业务中,通过对大规模文本数据的分析,找出里面的聚集观点,有助于发现新的问题或者重点问题。 通过对评论文本的分析,我们可以发现消费者关注的产品或服务痛点 通过对店铺商品标题的文本聚类,可以知…

Node入门以及express创建项目

前言 记录学习NodeJS 一、NodeJS是什么&#xff1f; Node.js 是一个开源和跨平台的 JavaScript 运行时环境 二、下载NodeJs 1.下载地址(一直点击next即可&#xff0c;记得修改安装地址) https://nodejs.p2hp.com/download/ 2.查看是否安装成功&#xff0c;打开命令行 nod…

性能调优 15. JVM调优实战及常量池详解

1. 阿里巴巴Arthas详解 1.1. 介绍 ‌‌‌  Arthas 是 Alibaba 在 2018 年 9 月开源的 Java 诊断工具。支持 JDK6&#xff0c; 采用命令行交互模式&#xff0c;可以方便的定位和诊断线上程序运行问题。 ‌‌‌  Arthas 官方文档十分详细&#xff0c;详见 ‌‌‌  http…

可视化图表:如此高颜值柱状图,其实简单配置就能实现。

这不又有某个boss给我图截图一些柱状性图表&#xff0c;说他们的前端觉得很难&#xff0c;说了一堆技术术语&#xff0c;他也不懂&#xff0c;截图我看到后&#xff0c;就给了他一个网址&#xff0c;马上就解决了。 在这里给大家摘录出几个比较有特色的柱状图出来&#xff0c;让…

大模型中的计算精度——FP32, FP16, bfp16之类的都是什么???

大模型中的计算精度——FP32, FP16, bfp16之类的都是什么&#xff1f;&#xff1f;&#xff1f; 这些精度是用来干嘛的&#xff1f;&#xff1f;混合精度 mixed precision training什么是混合精度&#xff1f;怎么转换呢&#xff1f; 为什么大语言模型通常使用FP32精度训练量化…

Maven常用命令介绍(Ⅰ)

基本命令 Maven生命周期 Maven的生命周期是对所有的构建过程进行抽象和统一。Maven的生命周期是抽象的&#xff0c;这意味着生命周期本身不做任何实际的工作&#xff0c;生命周期只是定义了一系列的阶段&#xff0c;并确定这些阶段的执行顺序。而在执行这些阶段时&#xff0c;…

基于iBeacon蓝牙定位技术的反向寻车系统

随着城市化进程的加速和汽车保有量的不断增加&#xff0c;大型停车场成为了人们日常生活中不可或缺的一部分。然而&#xff0c;在繁忙的停车场中快速找到自己的车辆&#xff0c;成为了许多车主的难题。为了解决这一问题&#xff0c;维小帮基于iBeacon蓝牙技术打造的反向寻车系统…

完美的移动端 UI 风格让客户无可挑剔

完美的移动端 UI 风格让客户无可挑剔

【CDN】逆天 CDN !BootCDN 向 JS 文件中植入恶意代码

今天在调试代码&#xff0c;突然控制台出现了非常多报错。 这非常可疑&#xff0c;报错指向的域名也证实了这一点。 因为我的 HTML 中只有一个外部开源库&#xff08;qrcode.min.js&#xff09;&#xff0c;因此只有可能是它出现了问题。 我翻看了请求记录&#xff0c;发现这…

pyinstall打包exe报错

1- 报错 Please install pywin32-ctypes. 前提&#xff1a;python安装路径中已经安装了pywin32-ctypes。 运行pyinstaller报错 PyInstaller cannot check for assembly dependencies. Please install pywin32-ctypes. 解决思路&#xff1a; python安装路径下Lib\site-packa…

金蝶云星空程序员开发快速入门

文章目录 一 前言1.1 学习步骤1.2 学习需知 二、学习金蝶*云星空的步骤2.1 下载金蝶*云星空安装到本地2.2 查看官网的学习资料2.3 如何使用C#进行插件开发2.4 sqlserver的表设计以及存储过程2.5 如何使用python进行插件的开发2.6 第三方程序如何调用金蝶*云星空的数据 三 后记 …

Springboot项目ES报异常query_shard_exception

详细异常信息如下&#xff1a; {"error": {"root_cause": [{"type": "query_shard_exception","reason": "failed to create query: {\n \"bool\" : {\n \"filter\" : [\n {\n \…

Android采用Scroller实现底部二楼效果

需求 在移动应用开发中&#xff0c;有时我们希望实现一种特殊的布局效果&#xff0c;即“底部二楼”效果。这个效果类似于在列表底部拖动时出现额外的内容区域&#xff0c;用户可以继续向上拖动查看更多内容。这种效果可以用于展示广告、推荐内容或其他信息。 效果 实现后的…

官方文档 搬运 MAXMIND IP定位 mysql导入 简单使用

官方文档地址&#xff1a; 官方文档 文件下载 1. 导入mysql可能报错 Error Code: 1290. The MySQL server is running with the --secure-file-priv option so it cannot execute this statement 查看配置 SHOW GLOBAL VARIABLES LIKE %secure%;secure_file_priv 原来…

3D 图片悬停效果

3D 图片悬停效果 效果展示 CSS 知识点 background 属性的综合运用transform 属性的综合运用 页面整体布局 <div class"box"><span style"--i: 0"></span><span style"--i: 1"></span><span style"--i…

连锁门店收银系统源码!

1.系统概况 智慧新零售系统是一套针对零售行业的saas收银系统&#xff0c;线下线上一体化的收银系统。核心功能涵盖了线下收银、小程序商城、会员管理、50营销插件、ERP进销存管理、跑腿配送等行业解决方案。 2.适用行业及门店 智慧新零售是针对零售行业的saas收银系统&#…

RabbitMQ实践——交换器(Exchange)绑定交换器

在《RabbitMQ实践——交换器&#xff08;Exchange&#xff09;和绑定&#xff08;Banding&#xff09;》一文中&#xff0c;我们实验了各种交换器。我们可以把交换器看成消息发布的入口&#xff0c;而消息路由规则则是由“绑定关系”&#xff08;Banding&#xff09;来定义&…