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

news2024/11/24 13:45:11

🍀简介

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.coloradmin.cn/o/1826833.html

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

相关文章

Linux基础 (十八):Libevent 库的安装与使用

目录 一、Libevent 概述 1.0 Libevent的安装 1.0.1 使用源码方式 1.0.2 终端命令行安装 1.1 主要特性 1.2 主要组件 1.3 Libevent 使用模型 1.4 原理 1.5 使用的基本步骤 1.5.1 初始化事件基础设施 1.5.2. 创建和绑定服务器套接字 1.5.3. 设置监听事件 1.5.4. 定义…

电脑缺失d3dcompiler_47.dll会怎么样,该如何修复呢

在计算机使用过程中&#xff0c;我们常常会遇到一些错误提示&#xff0c;其中之一就是“缺少d3dcompiler47.dll文件”。那么&#xff0c;d3dcompiler47.dll到底是什么&#xff1f;为什么计算机会缺失它&#xff1f;它会对电脑产生什么具体影响&#xff1f;如何解决这个问题&…

【CT】LeetCode手撕—25. K 个一组翻转链表

目录 题目1-思路2- 实现⭐25. K 个一组翻转链表——题解思路 3- ACM实现 题目 原题连接&#xff1a;25. K 个一组翻转链表 1-思路 1. dummyHead&#xff1a;设置虚拟头结点&#xff0c;通过虚拟头结点保证每个结点的地位相同2. 定位 pre 和 end 拆链&#xff1a;借助 pre 、s…

(新)Spring Security如何实现登录认证(实战篇)

一、回顾认证流程详解 概念速查: Authentication接口: 它的实现类&#xff0c;表示当前访问系统的用户&#xff0c;封装了用户相关信息。 AuthenticationManager接口&#xff1a;定义了认证Authentication的方法 UserDetailsService接口&#xff1a;加载用户特定数据的核心接…

软件体系结构笔记(自用)

来自《软件体系结构原理、方法与实践&#xff08;第三版&#xff09;》清华大学出版社 张友生编著 1-8章12章 复习笔记 如有错误&#xff0c;欢迎指正&#xff01;&#xff01;&#xff01;

Python使用策略模式生成TCP数据包

使用策略模式&#xff08;Strategy Pattern&#xff09;来灵活地生成不同类型的TCP数据包。 包括三次握手、数据传输和四次挥手。 from scapy.all import * from scapy.all import Ether, IP, TCP, UDP, wrpcap from abc import ABC, abstractmethodclass TcpPacketStrategy(A…

网络安全技术实验六 入侵检测技术实践

一、实验目的和要求 理解基于网络的入侵检测系统的基本原理&#xff0c;掌握snort IDS工作机理&#xff1b; 学习应用snort三种方式工作&#xff1b;熟练编写snort规则&#xff1b; 完成snort数据包记录、日志查看、字符串匹配、ARP欺骗攻击检测、端口扫描工具检测等功能。 …

微信小游戏插件申请,微信小程序插件管理

微信小游戏的插件申请与小程序不一样&#xff0c;官方没有提供一个统一的管理入口进行申请插件&#xff0c;以及查看插件&#xff0c;没有小程序方便的&#xff1b; 小程序申请查看插件入口如下图所示&#xff1a; 小游戏的插件可以通过以下的方式进行申请&#xff1a; 如下…

代码随想录-Day31

455. 分发饼干 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;这是能让孩子们满足胃口的饼干的最小尺寸&#xff1b;并且每块饼干 j&#xff0c;都…

OpenCV形态学

什么事形态学处理 基于图像形态进行处理的一些基本方法&#xff1b; 这些处理方法基本是对二进制图像进行处理&#xff1b; 卷积核决定着图像出来后的效果。 一 图像二值化 什么是二值化 将图像的每个像素变成两种值&#xff0c;如0,255. 全局二值化。 局部二值化。 thres…

小学奥数-图像找规律之招聘测评题

文章目录 长得差不多平移&#xff08;1&#xff09;&#xff08;2&#xff09; 旋转规律&#xff08;1&#xff09; 翻转规律 长得有点不一样叠加 参考 比如腾讯给他投简历之后会发一个在线测评&#xff0c;这些题目有和公务员考试很像的 长得差不多 几张图长得差不多的时候&a…

TCP/IP协议深入解析,初学者必看!

简介 在信息技术飞速发展的今天&#xff0c;网络已成为人类社会不可或缺的部分。实现网络中计算机相互通信的关键之一便是TCP/IP协议。作为互联网的基础&#xff0c;TCP/IP协议确保了全球范围内的数据交换和信息共享。 TCP/IP&#xff08;传输控制协议/网际协议&#xff09;是…

大数据实训项目(小麦种子)-01、VirtualBox安装与Centos7系统安装

文章目录 前言项目介绍项目任务目标一、VirtualBox安装1.1、认识VirtualBox1.2、VirtualBox的下载安装 二、VirtualBox安装Centos7系统2.1、VirtualBox安装Centos72.2、Centos7配置静态IP地址2.3、Centos7环境基础配置 三、Windows安装FinalShell及连接Centos73.1、FinalShell下…

神经网络学习2

张量&#xff08;Tensor&#xff09;是深度学习和科学计算中的基本数据结构&#xff0c;用于表示多维数组。张量可以看作是一个更广义的概念&#xff0c;涵盖了标量、向量、矩阵以及更高维度的数据结构。具体来说&#xff0c;张量的维度可以是以下几种形式&#xff1a; 标量&am…

环保评A的意义与价值

环保评A&#xff0c;这个看似简单的称谓&#xff0c;背后却蕴藏着深厚的环保理念和实践标准。在当今社会&#xff0c;环保已经成为一项全球性的议题&#xff0c;各国都在努力推动绿色发展&#xff0c;实现可持续发展目标。那么&#xff0c;环保评A究竟是全国性的认证还是地方性…

在VMware中安装CentOS7(超详细的图文教程)

1、CentOS7的下载 官网下载地址&#xff1a;Download。 进入CentOS下载官网&#xff0c;找到64位的CentOS7版本。 点进来后&#xff0c;发现它给我们列出了所在区域可用镜像源&#xff08;可以说是非常的良心的&#xff09;&#xff0c;我们随便选择一个&#xff0c;这里以阿…

Git使用-gitlab上面的项目如何整到本地的idea中

场景 一般我们在开发项目或者接手某个项目时&#xff0c;基本都要接触Git&#xff0c;比如上传项目代码&#xff0c;下载同事给你的交接代码等等。 这是一个基本功&#xff0c;小小整理一下日常操作中的使用。 第一步&#xff1a;在 GitLab 上找到你要克隆的项目&#xff0c;复…

C#传值参数 -1值类型 -2引用类型

传值参数 -1值类型 -2引用类型 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; //传值参数-1、值类型 2、引用类型 namespace PamatetersExample {class Program{static void Main(string[] args){St…

【odoo15】前端自定义模态弹窗

概要 在odoo15或者在15之前&#xff0c;odoo前端的owl框架还没完全替换当前前端框架的时候&#xff0c;我们很多时候都是用js或者jq来直接操作dom&#xff0c;那么我们如果需要在前端用到一个模态弹窗&#xff0c;可以怎么解决呢&#xff1f; 方法1 直接用js原生的模态弹窗&am…

CMU最新论文:机器人智慧流畅的躲避障碍物论文详细讲解

CMU华人博士生Tairan He最新论文&#xff1a;Agile But Safe: Learning Collision-Free High-Speed Legged Locomotion 代码开源&#xff1a;Code: https://github.com/LeCAR-Lab/ABS B站实际效果展示视频地址&#xff1a;bilibili效果地址 我会详细解读论文的内容,让我们开始吧…