一、简要阐述

ASP.NET Core引入了Options模式,使用类来表示相关的设置组。简单的来说,就是用强类型的类来表达配置项,这带来了很多好处。利用了系统的依赖注入,并且还可以利用配置系统。它使我们可以采用依赖注入的方法直接使用绑定的一个对象,这个对象就叫做Options对象。也可以叫做配置对象。

引入NuGet包:Microsoft.Extensions.Options

二、使用场景

  1. IOptions
  • 不支持

    • 在应用启动后读取配置数据。
    • 命名选项
  • 注册为单一实例,可以注入到任何服务生存期。
  1. IOptionsSnapshot
  • 作用域容器配置热更新使用它
  • 注册为范围内,因此无法注入到单一实例服务
  • 支持命名选项
  1. 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使用的更多相关文章

  1. 【ASP.NET Core】选项模式的相关接口

    在 .NET 中,配置与选项模式其实有联系的(这些功能现在不仅限于 ASP.NET Core,而是作为平台扩展来提供,在其他.NET 项目中都能用).配置一般从多个来源(上一篇水文中的例子,记得否?) ...

  2. asp.net core 3.0 选项模式1:使用

    本篇只是从应用角度来说明asp.net core的选项模式,下一篇会从源码来分析 1.以前的方式 以前我们使用web.config/app.config时是这样使用配置的 var count = Co ...

  3. (13)ASP.NET Core 中的选项模式(Options)

    1.前言 选项(Options)模式是对配置(Configuration)的功能的延伸.在12章(ASP.NET Core中的配置二)Configuration中有介绍过该功能(绑定到实体类.绑定至对 ...

  4. [ASP.NET Core 3框架揭秘] Options[1]: 配置选项的正确使用方式[上篇]

    依赖注入不仅是支撑整个ASP.NET Core框架的基石,也是开发ASP.NET Core应用采用的基本编程模式,所以依赖注入十分重要.依赖注入使我们可以将依赖的功能定义成服务,最终以一种松耦合的形式 ...

  5. [ASP.NET Core 3框架揭秘] Options[2]: 配置选项的正确使用方式[下篇]

    四.直接初始化Options对象 前面演示的几个实例具有一个共同的特征,即都采用配置系统来提供绑定Options对象的原始数据,实际上,Options框架具有一个完全独立的模型,可以称为Options ...

  6. 基于SqlSugar的开发框架循序渐进介绍(7)-- 在文件上传模块中采用选项模式【Options】处理常规上传和FTP文件上传

    在基于SqlSugar的开发框架的服务层中处理文件上传的时候,我们一般有两种处理方式,一种是常规的把文件存储在本地文件系统中,一种是通过FTP方式存储到指定的FTP服务器上.这种处理应该由程序进行配置 ...

  7. ASP.NET Core 2.2 基础知识(七) 选项模式

    承接上一篇 配置, 选项模式是专门用类来表示相关配置的服务. 基本选项配置 新建一个选项类,该类必须是包含无参数的构造函数的非抽象类. public class MyOptions { public ...

  8. 第十节:Asp.Net Core 配置详解和选项模式

    一. 各种文件的读取 1.说明 在.Net Core中,各种配置文件的读取都需要依赖[Microsoft.Extensions.Configuration]程序集,当然在Asp.Net Core中已经 ...

  9. Asp.Net Core 选项模式的三种注入方式

    前言 记录下最近在成都的面试题, 选项模式的热更新, 没答上来 正文 选项模式的依赖注入共有三种接口, 分别是 IOptions<>, IOptionsSnapshot<>, ...

随机推荐

  1. NAO机器人开发环境配置

    python python2.7用于NAO开发 https://www.python.org/downloads/release/python-2718/ python3.6用于其他程序测试. htt ...

  2. tep0.9.5支持自定义扩展request

    tep0.9.5更新了以下内容: 自定义request请求日志 Allure报告添加request描述 猴子补丁扩展request fixtures支持多层级目录 FastAPI替代Flask 升级t ...

  3. Tomcat-部署web工程方式

    Tomcat(部署web工程) 第一种方法:只需要把web工程的目录拷贝到Tomcat的webapps目录下即可 1,在webapps目录下创建一个book工程, 2,或者把做的工程内容拷贝到weba ...

  4. iOS14新功能一览

    这是转载的6月份的一篇文章,但是和今天发布的 ios14 正式版基本一致,可以大概参考一下. 23 号凌晨的 WWDC ,小狐也是恪尽职守啊!从开场到收尾,小狐一点也没落下,整场大会围绕着 Apple ...

  5. 学习JAVAWEB第八天

    1. C/S:客户端/服务器端 2. B/S:浏览器/服务器端 2. 资源分类 1. 静态资源:所有用户访问后,得到的结果都是一样的,称为静态资源.静态资源可以直接被浏览器解析 * 如: html,c ...

  6. Hello,find!

    Hello,find! 前言 余幼时,每至除夕,爆竹声声,如雷贯耳,醒于梦中,便知春节将至.与兄长二三人,执摔炮六七只, 玩耍于廷中.出门罢,廷中白雪覆于黄土之上.二三尺之外,见犬窝,余之爱犬趴于其中 ...

  7. java中的泛型,简单介绍。 修饰方法的用法

    一.<R>  ( R  r ) 默认object  可以存所有类型.   R 这个是随便定义的大写字母,前后要保持一致性! package com.aaa.test; /* * 演示 泛型 ...

  8. Luogu_P2048

    超级钢琴 有 \(n\) 个音符,编号从 \(1\) 到 \(n\) .第 \(i\) 个音符的美妙度为 \(A_i\) . 我们要找到 \(k\) 段不同超级和弦组成的乐曲,每段乐曲的连续音符个数 ...

  9. 「CTSC 2011」排列

    「CTSC 2011」排列 要求不存在公差为 A 或者公比为 B 的子列,那么实际上可以把该问题转化为求一个图的最优拓朴序. 任意差为 A 或者比为 B 的两个数连一条边. 求一个合法序列的答案可以用 ...

  10. JAVA多线程提高十四:同步工具Exchanger

    Exchanger可以在对中对元素进行配对和交换的线程的同步点.每个线程将条目上的某个方法呈现给 exchange 方法,与伙伴线程进行匹配,并且在返回时接收其伙伴的对象.Exchanger 可能被视 ...