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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins三种构建类型

目录 传送门前言一、概念二、前置处理&#xff08;必做&#xff09;1、赋予777权限2、让jenkins用户拥有root用户的kill权限3、要运行jar包端口号需要大于1024 三、自由风格软件项目&#xff08;FreeStyle Project&#xff09;&#xff08;推荐&#xff09;三、Maven项目&#…

【YashanDB知识库】PHP使用OCI接口使用数据库绑定参数功能异常

【问题分类】驱动使用 【关键字】OCI、驱动使用、PHP 【问题描述】 PHP使用OCI8连接yashan数据库&#xff0c;使用绑定参数获取数据时&#xff0c;出现报错 如果使用PDO_OCI接口连接数据库&#xff0c;未弹出异常&#xff0c;但是无法正确获取数据 【问题原因分析】 开启O…

springcloud第4季 分布式事务seata作用服务搭建

一 seata作用 1.1 作用 二 seata服务端搭建 2.1 seata搭建 2.2.1 seata 服务端下载安装 下载地址&#xff1a; Seata-Server下载 | Apache Seata 截图如下&#xff1a; 2.2.2 使用mysql初始化seata所需表 1.下载脚本地址&#xff1a;incubator-seata/script/server/db/…

2024最新D卷 华为OD统一考试题库清单(按算法分类),如果你时间紧迫,就按这个刷

目录 专栏导读华为OD机试算法题太多了&#xff0c;知识点繁杂&#xff0c;如何刷题更有效率呢&#xff1f; 一、逻辑分析二、数据结构1、线性表① 数组② 双指针 2、map与list3、队列4、链表5、栈6、滑动窗口7、二叉树8、并查集9、矩阵 三、算法1、基础算法① 贪心思维② 二分查…

Nas实现软路由OpenWrt安装

文章目录 基本配置步骤 基本配置 NAS&#xff1a;TS-264C 宇宙魔方 步骤 1.下载软路由OpenWrt 下载地址&#xff1a;https://openwrt.org/ 2.下载好以后&#xff0c;需要下载虚拟盘转换工具&#xff08;StarWind V2V Convert&#xff09; 下载地址&#xff1a;https://…

大模型与知识智能:心理疾病治疗的新希望

前言 随着社会的发展&#xff0c;心理疾病已成为一个日益突出的问题。据《柳叶刀》杂志的系统性综述显示&#xff0c;疫情之后&#xff0c;全世界抑郁症与焦虑症的患病率上升超过25%&#xff0c;其中青少年心理健康的影响最大。此外&#xff0c;2021年国内的精神障碍报告显示&…

Docker 镜像库国内加速的几种方法

在国内&#xff0c;拉取 Docker 镜像速度慢 / 时不时断线 / 无账号导致限流等&#xff0c;比较痛苦。 这里提供几个当前可用的镜像仓库&#xff0c;更新到/etc/docker/daemon.json即可。 更新完记得运行&#xff1a; sudo systemctl daemon-reload sudo systemctl restart …

以keepalived为例说明程序不能正常被gdb调试的原因

现象 通过gdb att $keepalived_pid发起对当前运行keepalived的调试&#xff1b; 在放行keepalived继续执行后&#xff0c;想通过CtrlC按键中断执行&#xff0c;观察下被调试程序的当前内部状态&#xff0c; 但是&#xff0c;在终端输入CtrlC后&#xff0c;导致keepalived被调…

一般简单的功能使用GIS 服务器工具还需要进行扩展开发吗?

有网友困惑怎么使用了我们的 GIS 服务器工具&#xff0c;一些简单的功能需不需要对服务器进行扩展开发&#xff1f;下面我们首先看一下标准GIS WEB服务器例如GEOSERVER&#xff0c;QGISSERVER、GIS数据快捷共享发布工具&#xff08;建立自己的地图网站&#xff09;及其它一些商…

Python虚拟环境的配置

前言&#xff1a; 本人一度被Python的虚拟环境的配置所困扰&#xff0c;前段时间抽空学习了一下&#xff0c;现在总结一下方法&#xff0c;供大家参考。 先使用winr打开命令行窗口。 展示所有虚拟环境 conda env list 创建虚拟环境 例如我们创建一个叫做py_sk的虚拟环境 …

【数据结构】遍历二叉树(递归思想)-->赋源码

欢迎来到我的Blog&#xff0c;点击关注哦&#x1f495; 前言 二叉树遍历是指按照一定的顺序访问二叉树中的每个节点&#xff0c;使得每个节点恰好被访问一次。遍历是二叉树上最重要的运算之一&#xff0c;是二叉树上进行其他运算的基础。 一、二叉树遍历概念 二叉树遍历分类 …

Windows 11 中安装 Docker Desktop 并安装镜像

本该主要介绍在 Windows 11 中安装 Docker Desktop 时的一些准备工作&#xff0c;以及该如何下载和安装&#xff0c;然后分别使用管理界面和 Docker 命令安装两个镜像。 一、准备工作 在 Windows 11 中安装 Docker Desktop 前&#xff0c;需要做一些准备。打开 【Windows 功能…

大模型是什么?能干嘛?怎么学?

引言 随着人工智能技术的飞速发展&#xff0c;大模型研究已成为该领域的一大热点。这些研究覆盖了众多方向&#xff0c;每个方向都面临着独特的研究焦点和挑战。本文将逐一探讨一些备受关注的研究方向&#xff0c;包括检索增强生成RAG、大模型Agent、Mamba、MoE、LoRA等&#…

字符数组基础知识及题目

死识。。。 字符该如何存储呢&#xff1f;这一点我们在以前就接触过了。用char来存储。 如何输入一个单词呢&#xff1f; char a[10002]; scanf("%s",a); 就不用地址符了。 如何输入句子呢&#xff1f; char a[100002]; gets(a); gets是读入句子的&#xff0c…

如何阅读?从阅读中学阅读—《海绵阅读法》

大家好&#xff0c;我是老三&#xff0c;最近读了《海绵阅读法&#xff1a;如何吸收一本书的精华》&#xff0c;第一次阅读教如何阅读的书&#xff0c;整理一番读书笔记&#xff0c;分享给大家。 读书动机 我前一阵子写了篇文章&#xff0c;2024Q1&#xff0c;盘点我看过的54本…

防止Selenium被检测 Google Chrome 125

背景 最近在使用selenium自动播放学习课程&#xff0c;相信大家也有一些类似的使用场景。 能自动化的事情&#xff0c;绝不自己干。 为防止被检测是机器人做题&#xff0c;刷视频&#xff0c;需要做一些小调整。 先来看作为服务方维护者&#xff0c;是如何检测是Selenium打…

【算法-力扣】73.矩阵置零,一文彻底搞懂!

目录 一、题目描述 二、解题思路 三、参考答案 一、题目描述 矩阵置零 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 进阶&#xff1a; 一个直观的解决方案是使用 O(mn) 的额外空间&#x…

甄嬛传熹贵妃上户口:如果让他陪你过冬天,那朕能不能睡中间?贝叶斯模型推导爸爸去哪儿

关注微信公众号 数据分析螺丝钉 免费领取价值万元的python/java/商业分析/数据结构与算法学习资料 背景 《甄嬛传》是大家耳熟能详的宫廷剧&#xff0c;其中复杂的宫斗情节和深刻的人物刻画让人津津乐道。甄嬛因为与皇帝(四郎)闹翻了&#xff0c;去甘露寺待了一段时间&#x…

0613,基本数据类型,表达式

题目1&#xff0c;选做&#xff1a; 假设 int n 0xCAFE; 请用表达式完成下面操作 (拓展题&#xff1a;不要求每个同学都写) (a) 测试最后 4 位中是不是最少有 3 位为 1. (b) 逆转字节序(i.e.,使 n 0xFECA) (c) 旋转 4 位 (i.e., 使 n 0xECAF) 答案代码/补&#xff1a; …

Elasticsearch 认证模拟题 - 18

一、题目 为一个索引&#xff0c;按要求设置以下 dynamic Mapping 一切 text 类型的字段&#xff0c;类型全部映射成 keyword一切以 int_ 开头命名的字段&#xff0c;类型都设置成 integer 1.1 考点 字段的动态映射 1.2 答案 # 创建索引和索引模板 PUT my_index {"m…