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.pswp.cn/news/282956.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282956.shtml
英文地址,請注明出處:http://en.pswp.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 * &…