ASP.NETCoreWeb开发之OptionsPattern

    这节我们来讲一下,在ASP.NET Core Web开发中,读取配置文件信息的新方式:Options。

前言 /

Options

    在ASP.NET Web框架中,我们读取配置文件中的数据,在不使用第三方框架的情况下,可能需要通过ConfigurationManager这个类去读取配置文件中的信息,并且,如果我们人为更改了配置文件,需要重启系统才能使新的配置数据生效。这种方式并不能称得上优雅和高效。

    所以,在ASP.NET Core Web框架中,微软为我们提供了读取配置信息的新方式——将配置信息映射到数据类中,并且配合IOC,可以通过依赖注入的方式拿到这个类,读取我们想要的信息,下面就来了解一下它。

如何配置?/

Options

    首先,我们需要如下前置信息:

  • 在appsettings.json中配置要读取的信息(如下图,此处名称“MyOptions”可自定义)

f4516c4ebb1b8bdf3ba57da296c65eab.png

  • 对应的编写一个数据类

4e3cfc9aa0987788b976d876da1a59e1.png

    然后,我们就可以选择在Startup.cs中,编写配置相关代码(在Program.cs文件中也可以指定配置,具体大家可以参考官网文档),请看下图:

c6058e8a21f1cfaeeaf996f17b25f366.png

    在ConfigureServices方法中,我们可以配置Options。方式有很多种,此处仅演示比较简单的几种。通过使用services的Configure/AddOptions泛型方法,其泛型类型为要映射的类,然后指定要读取的区域(即Section),即可完成配置。默认如果不指定SectionName,则自动使用类名进行匹配,如果读取SectionName跟映射的类名不一致,则使用其重载方法,传入SectionName即可。

IOptions<T>/

Options

    在完成配置以后,就可以使用依赖注入的方式,在需要的地方获取到配置信息,注入的形式之一是IOptions<T>接口,泛型T则指定为映射的配置类,请看下图:

8e147e0f4f998ec2ebe67a8dbd7addc7.png

    使用IOptions<T>注入的配置对象,不具有动态性,也就是说系统运行时修改配置文件,是不会自动更新的。所以可以在类中直接声明配置类对象,在构造方法中直接从IOptions的Value属性中取到。

    让我们打印出来看一下:

edde778d205ecb6e62e7127a7a42eec7.png

a74427bce5021e577315a564ddda0760.png

    这样的形式,是优雅的,面向对象的,但是在系统的整个运行过程中,使用IOptions<T>注入的配置对象,是不会随配置信息的改变而变化的,也就说,还是要重启才能看到配置信息的更改。

IOptionsSnapshot<T>/

Options

    当然,除了IOptions<T>,我们还可以使用IOptionsSnapshot<T>去注入配置对象:

29c67e0036b20200df0fd21e00b148a8.png

    IOptionsSnapshot接口,提供了对配置信息的更新功能,但是并不是实时的,在同一个域或者本次请求中如果出现配置信息更改,配置对象中的数据是不会变化的,也就是保证整个上下文中的配置信息不会改变。为此,上述代码中我与IOptions做出对比,第一次请求数据两者相同,为初始值:

//第 1 次请求
IOptions:name:Charles,age:18,profession:.NET Developer
IOptionsSnapshot:name:Charles,age:18,profession:.NET Developer

然后我修改配置文件,进行第二次请求,IOptionsSnapshot重新读取了配置信息:

d5a8f41d3d3845aa79b09bd9648fe10a.png

//第 2 次请求
IOptions:name:Charles,age:18,profession:.NET Developer
IOptionsSnapshot:name:宿春磊,age:19,profession:.NET 开发者

IOptionsMonitor<T>/

Options

    最后,除了IOptionsSnapshot,微软还提供了IOptionsMonitor,这位则是提供“全天候”的配置监控服务,配置文件一改,它就立刻更新,请看下图:

c86055ad506e446b4615a9038e00dd0d.png

    我将三者做一对比,在读取前就通过代码更新配置文件,因为OptionsPattern是延迟读取的,所以在改之前使IOptionsSnapshot读取一遍值,这样才能体现出三者的不同:

//第 1 次请求
IOptions:name:宿春磊,age:19,profession:.NET 开发者
IOptionsSnapshot:name:宿春磊,age:19,profession:.NET 开发者
IOptionsMonitor:name:宿春磊Charles,age:19,profession:.NET 开发者

    第二次请求的时候,IOptionsSnapshot才取到新值。

//第 2 次请求
IOptions:name:宿春磊,age:19,profession:.NET 开发者
IOptionsSnapshot:name:宿春磊Charles,age:19,profession:.NET 开发者
IOptionsMonitor:name:宿春磊Charles,age:19,profession:.NET 开发者

本节到此结束...


参考:

https://docs.microsoft.com/zh-CN/dotnet/core/extensions/options

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

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

相关文章

SpringMVC执行流程图

2019独角兽企业重金招聘Python工程师标准>>> 转载于:https://my.oschina.net/u/2607324/blog/827946

CC框架实践(1):实现登录成功再进入目标界面功能

在掘金上看到这篇文章&#xff1a;android 关于先登录成功后再进入目标界面的思考,作者对实现登录成功后再跳转到目标界面功能作了比较详细的分析&#xff0c;对比了一些已有的实现方案并指出存在的问题。最终&#xff0c;作者实现了一个可同时添加多个条件判断拦截的方案&…

yum search php7,yum install php7 in centos6

如果有安装的PHP包&#xff0c;先删除他们yum list installed | grep phpyum remove php.x86_64 php-cli.x86_64 php-common.x86_64 php-gd.x86_64 php-ldap.x86_64 php-mbstring.x86_64 php-mcrypt.x86_64 php-mysql.x86_64 php-pdo.x86_64yum 安装我们需要的软件1.安装epel软…

CentOS 7系统安装配置图解教程

操作系统&#xff1a;CentOS 7.3 备注&#xff1a; CentOS 7.x系列只有64位系统&#xff0c;没有32位。生产服务器建议安装CentOS-7-x86_64-Minimal-1611.iso版本 一、安装CentOS 7.3 成功引导系统后&#xff0c;会出现下面的界面 界面说明&#xff1a; Install CentOS 7 #安装…

这份《.NET/C#面试手册》超神啦!

这几天给.neter们整理了一份《.NET/C#面试手册》&#xff0c;目前大约4万字左右&#xff0c;初衷也很简单&#xff0c;就是希望在面试的时候能够帮助到大家&#xff0c;减轻大家的负担和节省时间。对于没有跳槽打算的也可以复习一下相关知识点&#xff0c;就当是查缺补漏&#…

Dinic算法----最大流常用算法之一

——没有什么是一个BFS或一个DFS解决不了的&#xff1b;如果有&#xff0c;那就两个一起。 最大流的$EK$算法虽然简单&#xff0c;但时间复杂度是$O(nm^2)$&#xff0c;在竞赛中不太常用。 竞赛中常用的$Dinic$算法和$SAP$&#xff0c;其实也不太难。 那么&#xff0c;$Dinic$算…

springcloud~Eureka实例搭建

服务端 build.gradle配置 dependencies {compile(org.springframework.cloud:spring-cloud-starter-netflix-eureka-server)testCompile(org.springframework.boot:spring-boot-starter-test) }dependencyManagement {imports {mavenBom "org.springframework.cloud:sprin…

php5.3教程,Php 5.3发布

PHP 5.3.4 特性&#xff1a; 增加对zip 流的统计支持 新增 follow_location (默认启用)支持 增加一个 3rd parameter to get_html_translation_table Implemented FR #52348, added new constant ZEND_MULTIBYTE to detect zend multibyte at runtime. Multiple improvements t…

javascript学习笔记 null和undefined

null是javascript语言的关键字&#xff0c;它表示一个特殊值&#xff0c;常用来描述“空值”。对null执行typeof预算&#xff0c;结果返回字符串“object”&#xff0c;也就是说&#xff0c;可以将null认为是一个特殊的对象值&#xff0c;含义是“非对象”。但实际上&#xff0…

C# 为什么高手都是用IsNullOrWhiteSpace对字符串判空?

判断字符串为空有好几种方法&#xff1a;方法一&#xff1a; 代码如下&#xff1a;static void Main(string[] args){string str "";if (str ""){Console.WriteLine("a is empty"); ;}Console.ReadKey();}运行结果&#xff1a;a is empty这样…

使用bcftools提取指定样本的vcf文件(extract specified samples in vcf format)

1、下载安装bcftools。 2、准备样本ID文件&#xff0c;这里命名为samplelistname.txt&#xff0c;一个样本一行&#xff0c;如下所示&#xff1a; sample1 sample2 sample3 3、输入命令&#xff1a; bcftools view -S samplelistname.txt /1000genomes/ALL.chr16.phase3_shapei…

iostat相关参数说明——await:平均每次设备I/O操作的等待时间 (毫秒),如果%util接近 100%,说明产生的I/O请求太多...

iostat是I/O statistics&#xff08;输入/输出统计&#xff09;的缩写&#xff0c;iostat工具将对系统的磁盘操作活动进行监视。它的特点是汇报磁盘活动统计情况&#xff0c;同时也会汇报出 CPU使用情况。同vmstat一样&#xff0c;iostat也有一个弱点&#xff0c;就是它不能对某…

php里面sql是什么意思,MySQL和SQL是什么?MySQL和SQL之间的区别有哪些

MySQL和SQL之间的区别有哪些&#xff1f;很多PHP的初学者&#xff0c;对MySQL&#xff0c;MyAdmin和SQL有什么区别并不是很清楚&#xff1f;下面 第一PHP社区 就带领大家来学习一下MySQL和SQL之间的区别。【推荐阅读&#xff1a;MySQL什么意思】一&#xff1a;什么是SQLSQL是一…

Blazor University (51)依赖注入 —— 拥有多个依赖项:错误的方式

原文链接&#xff1a;https://blazor-university.com/dependency-injection/component-scoped-dependencies/owning-multiple-dependencies-the-wrong-way/拥有多个依赖项&#xff1a;错误的方式OwningComponentBase[1] 类是一个合适的解决方案&#xff0c;当我们需要我们的组件…

Centos的yum源更换为国内的阿里云源

1、备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2、下载新的CentOS-Base.repo 到/etc/yum.repos.d/ CentOS 5 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-5.repo 或者 curl -o /etc/yum.repo…

Centos 7 搭建.net web项目

现在的.NET Core 1.0版本是一个很小的核心&#xff0c;APIs和工具也并不完整&#xff0c;但是随着.Net Core的不断完善&#xff0c;补充的Apis和创新也会一起整合到.NET Framework中。 安装centos系统 请自行安装或百度教程 安装 libicu包 和 dotnet 温馨提示&#xff1a;如果需…

Effective Objective-C 2.0 编写高质量iOS与OS X代码的52个有效方法笔记-协议与分类...

23、通过委托与数据源协议进行对象间通信 如果要在委托对象上调用可选方法&#xff0c;那么必须提前使用类型信息查询方法判断这个委托对象能否响应相关选择子。 if ( [_delegate respondsToSelector:selector(networkFetcher:didReceiveData:)]){ [_delegate networkFetcher:s…

用matlab求解工作时间调度问题,置换流水车间调度问题的MATLAB求解.doc

物流运筹实务课程设计题目&#xff1a;置换流水车间调度问题的MATLAB求解置换流水车间调度问题的MATLAB求解目录前言……………………………………………………………………… 5问题描述………………………………………………………………… 6算法设计…………………………………

EntityFrameworkCore 模型自动更新(上)

【导读】嗯&#xff0c;距离上一次写博文已经过去近整整十个月&#xff0c;还是有一些思考&#xff0c;但还是变得懒惰了&#xff0c;心思也不再那么专注&#xff0c;有点耗费时间&#xff0c;学习也有点停滞不前&#xff0c;那就顺其自然&#xff0c;随心所欲吧&#xff0c;等…

IDEA 快捷注释

1. 新建类的注释模板 1) File->settings->Editor->Live Templates 2) 点击绿色号&#xff0c;选择template group &#xff0c;输入group的name&#xff0c;然后点ok 3) 选中刚才添加的group,点击号,选择live Template 4) 代码模板位置,个人用的代码: 1 /** 2 * &…