.Net Core之选项模式Options使用
一、简要阐述
ASP.NET Core引入了Options模式,使用类来表示相关的设置组。简单的来说,就是用强类型的类来表达配置项,这带来了很多好处。利用了系统的依赖注入,并且还可以利用配置系统。它使我们可以采用依赖注入的方法直接使用绑定的一个对象,这个对象就叫做Options对象。也可以叫做配置对象。
引入NuGet包:Microsoft.Extensions.Options
二、使用场景
- IOptions
- 不支持
- 在应用启动后读取配置数据。
- 命名选项
- 注册为单一实例,可以注入到任何服务生存期。
- IOptionsSnapshot
- 作用域容器配置热更新使用它
- 注册为范围内,因此无法注入到单一实例服务
- 支持命名选项
- IOptionsMonitor
- 用于检索选项并管理 TOptions 实例的选项通知。
- 注册为单一实例且可以注入到任何服务生存期。
- 支持
- 更改通知
- 命名选项
- 可重载配置
- 选择性选项失效
使用 IOptionsSnapshot 读取已更新的数据
IOptionsMonitor 和 IOptionsSnapshot 之间的区别在于:
- IOptionsMonitor 是一种单一示例服务,可随时检索当前选项值,这在单一实例依赖项中尤其有用。
- IOptionsSnapshot 是一种作用域服务,并在构造 IOptionsSnapshot 对象时提供选项的快照。 选项快照旨在用于暂时性和有作用域的依赖项。
三、代码实例
1、实体类
- public class MyOptionSetting
- {
- /// <summary>
- /// 姓名
- /// </summary>
- public string UserName { get; set; }
- /// <summary>
- /// 年龄
- /// </summary>
- public int Age { get; set; }
- /// <summary>
- /// 电话
- /// </summary>
- public string Phone { get; set; }
- /// <summary>
- /// 性别
- /// </summary>
- public string Sex { get; set; }
- }
2、控制器层
- public class HomeController : Controller
- {
- private readonly ILogger<HomeController> _logger;
- private readonly IOptions<MyOptionSetting> _options;
- private readonly IOptionsSnapshot<MyOptionSetting> _optionsSnapshot;
- private readonly IOptionsMonitor<MyOptionSetting> _optionsMonitor;
- public HomeController(ILogger<HomeController> logger
- , IOptions<MyOptionSetting> options
- , IOptionsSnapshot<MyOptionSetting> optionsSnapshot
- , IOptionsMonitor<MyOptionSetting> optionsMonitor)
- {
- _logger = logger;
- _options = options;
- _optionsSnapshot= optionsSnapshot;
- _optionsMonitor = optionsMonitor;
- _optionsMonitor.OnChange(ChangeListener);
- }
- /// <summary>
- /// 当选项模式是IOptionsMonitor ,修改配置文件appsetting.json保存时候会触发OnChange事件
- /// </summary>
- /// <param name="options"></param>
- private void ChangeListener(MyOptionSetting options)
- {
- Console.WriteLine(options.Age);
- }
- public IActionResult Index()
- {
- {
- // 获取UserName字段名信息
- var options = _options.Value.UserName;
- _logger.LogInformation($"options获取UserName字段名信息:{options}");
- // 获取MyOptionSetting所有配置信息
- var optionJson = JsonConvert.SerializeObject(_options.Value);
- _logger.LogInformation($"options获取MyOptionSetting所有配置信息:{optionJson}");
- }
- {
- // 获取UserName字段名信息
- var optionSnapshot = _optionsSnapshot.Value.UserName;
- _logger.LogInformation($"optionSnapshot获取UserName字段名信息:{optionSnapshot}");
- // 获取MyOptionSetting所有配置信息
- var optionSnapshotJson = JsonConvert.SerializeObject(_optionsSnapshot.Value);
- _logger.LogInformation($"options获取MyOptionSetting所有配置信息:{optionSnapshotJson}");
- }
- {
- // 获取UserName字段名信息
- var optionsMonitor = _optionsMonitor.CurrentValue.UserName;
- _logger.LogInformation($"optionsMonitor获取UserName字段名信息:{optionsMonitor}");
- // 获取MyOptionSetting所有配置信息
- var optionsMonitorJson = JsonConvert.SerializeObject(_optionsMonitor.CurrentValue);
- _logger.LogInformation($"optionsMonitor获取MyOptionSetting所有配置信息:{optionsMonitorJson}");
- }
- return View();
- }
- public IActionResult Privacy()
- {
- return View();
- }
- }
3、Startup类ConfigureServices方法注入配置
- public void ConfigureServices(IServiceCollection services)
- {
- services.AddControllersWithViews();
- // 注入
- services.Configure<MyOptionSetting>(Configuration.GetSection("MyOptionSetting"));
- }
4、appsettings.json文件配置
- "MyOptionSetting": {
- "UserName": "xiaohemiao",
- "Age": 19,
- "Phone": "10086",
- "Sex": "nan"
- }
四、效果呈现
五、划重点,最通俗的理解
1、使用IOptions,当程序正在运行中时,修改appsettings.json之后,刷新页面,页面读取的配置信息不会改变,读取的还是原来的配置信息。
2、使用IOptionsSnapshot,当程序正在运行中时,修改appsettings.json之后,刷新页面,页面读取的配置信息是最新的信息。
3、使用IOptionsMonitor,当程序正在运行中时,修改appsettings.json之后,刷新页面,页面读取的配置信息是最新的;当在页面中使用了监听事件,修改appsettings.json保存的时候会自动触发如上的OnChange事件,且读取的配置是最新的。
.Net Core之选项模式Options使用的更多相关文章
- 【ASP.NET Core】选项模式的相关接口
在 .NET 中,配置与选项模式其实有联系的(这些功能现在不仅限于 ASP.NET Core,而是作为平台扩展来提供,在其他.NET 项目中都能用).配置一般从多个来源(上一篇水文中的例子,记得否?) ...
- asp.net core 3.0 选项模式1:使用
本篇只是从应用角度来说明asp.net core的选项模式,下一篇会从源码来分析 1.以前的方式 以前我们使用web.config/app.config时是这样使用配置的 var count = Co ...
- (13)ASP.NET Core 中的选项模式(Options)
1.前言 选项(Options)模式是对配置(Configuration)的功能的延伸.在12章(ASP.NET Core中的配置二)Configuration中有介绍过该功能(绑定到实体类.绑定至对 ...
- [ASP.NET Core 3框架揭秘] Options[1]: 配置选项的正确使用方式[上篇]
依赖注入不仅是支撑整个ASP.NET Core框架的基石,也是开发ASP.NET Core应用采用的基本编程模式,所以依赖注入十分重要.依赖注入使我们可以将依赖的功能定义成服务,最终以一种松耦合的形式 ...
- [ASP.NET Core 3框架揭秘] Options[2]: 配置选项的正确使用方式[下篇]
四.直接初始化Options对象 前面演示的几个实例具有一个共同的特征,即都采用配置系统来提供绑定Options对象的原始数据,实际上,Options框架具有一个完全独立的模型,可以称为Options ...
- 基于SqlSugar的开发框架循序渐进介绍(7)-- 在文件上传模块中采用选项模式【Options】处理常规上传和FTP文件上传
在基于SqlSugar的开发框架的服务层中处理文件上传的时候,我们一般有两种处理方式,一种是常规的把文件存储在本地文件系统中,一种是通过FTP方式存储到指定的FTP服务器上.这种处理应该由程序进行配置 ...
- ASP.NET Core 2.2 基础知识(七) 选项模式
承接上一篇 配置, 选项模式是专门用类来表示相关配置的服务. 基本选项配置 新建一个选项类,该类必须是包含无参数的构造函数的非抽象类. public class MyOptions { public ...
- 第十节:Asp.Net Core 配置详解和选项模式
一. 各种文件的读取 1.说明 在.Net Core中,各种配置文件的读取都需要依赖[Microsoft.Extensions.Configuration]程序集,当然在Asp.Net Core中已经 ...
- Asp.Net Core 选项模式的三种注入方式
前言 记录下最近在成都的面试题, 选项模式的热更新, 没答上来 正文 选项模式的依赖注入共有三种接口, 分别是 IOptions<>, IOptionsSnapshot<>, ...
随机推荐
- VAE变分自编码器
我在学习VAE的时候遇到了很多问题,很多博客写的不太好理解,因此将很多内容重新进行了整合. 我自己的学习路线是先学EM算法再看的变分推断,最后学VAE,自我感觉这个线路比较好理解. 一.首先我们来宏观 ...
- Superset SSO改造和自定义宏命令
目录 背景 关于Superset 需要解决的问题 定制化改造 准备环境 改造OAuth SSO 安装依赖 配置SSO 添加自定义的SecurityManager 运行一下吧 自定义宏命令 开启配置 添 ...
- 聊一聊如何用C#轻松完成一个SAGA分布式事务
背景 银行跨行转账业务是一个典型分布式事务场景,假设 A 需要跨行转账给 B,那么就涉及两个银行的数据,无法通过一个数据库的本地事务保证转账的 ACID ,只能够通过分布式事务来解决. 市面上使用比较 ...
- 洛谷P1060 java题解
题目描述: 解题思路: 重要度相当于价值的倍率 (物品价格*重要度=价值) 经典的背包问题 直接DP把各种情况下的最优解打表出来取最后一个就行了 代码: import java.util.Scanne ...
- deque概述
1.简介 双端队列deque,与vector的最大差异在于: 一.deque运行常数时间对头端或尾端进行元素的插入和删除操作. 二.deque没有所谓的容器概念,因为它是动态地以分段连续空间组合而成随 ...
- X000001
一些相互无关联的题目的集合 都是码量不大,略有思维难度的题 做起来还是很舒适的 P6312 [PA2018]Palindrom 空间限制很小,不足以存下整个字符串,故暴力判断不可行. 考虑使用字符串哈 ...
- samb建立共享文件夹,windows报无法访问没有访问权限
一.首先确保你已经成功安装上了samba 二.在修改smb.conf文件之前,先拷贝一个备份,然后输入下面的命令修改smb.conf gedit /etc/samba/smb.conf将smb.con ...
- java getSource()和 getActionCommand()区别
感谢大佬:https://blog.csdn.net/LIU_YANZHAO/article/details/72740011?utm_source=blogxgwz1 比如说 按纽的事件,同一个JF ...
- C++网络编程卷1、卷2概述
转载请注明来源:https://www.cnblogs.com/hookjc/ 一: C++NPv1主要涉及到的类: 1.1. Logging_Server 是个抽象类,用来定义接口类型,此类不能 ...
- Firewalld防火墙——基础认知
Firewalld防火墙 1.Firewalld概述 2.firewalld与iptables 的区别 3.firewalld区域的概念 4.firewalld数据处理流程 5.firewalld检查 ...