如何讓.NET Core應用的配置與源文件保持同步?

来源:http://www.cnblogs.com/zyjj/archive/2017/07/10/7146103.html
-Advertisement-
Play Games

配置的同步涉及到兩個方面:第一,對原始的配置文件實施監控併在其發生變化之後從新載入配置;第二,配置重新載入之後及時通知應用程式進而使後者能夠使用最新的配置。接下來我們利用一個簡單的.NET Core控制台應用來演示針對文件的配置會涉及到數據同步的問題,我們希望應用能夠對原始配置文件實施監控,併在文件 ...


如何讓.NET Core應用的配置與源文件保持同步?_.NET_網路工程師_程式_課課家

 

  配置的同步涉及到兩個方面:第一,對原始的配置文件實施監控併在其發生變化之後從新載入配置;第二,配置重新載入之後及時通知應用程式進而使後者能夠使用最新的配置。接下來我們利用一個簡單的.NET Core控制台應用來演示針對文件的配置會涉及到數據同步的問題,我們希望應用能夠對原始配置文件實施監控,併在文件內容發生改變的時候從新載入並應用新的配置。針對JSON文件的配置源通過JsonConfigurationSource類型來表示,該類型定義在“Microsoft.Extensions.Configuration.Json”這個NuGet包中,所以我們需要在project.json文件中按照如下的形式添加針對這個NuGet包的依賴。

  1: {

  2: ...

  3: "dependencies": {

  4: ...

  5: "Microsoft.Extensions.Configuration.Json": "1.0.0"

  6: }

  7: }

  假設我們需要通過配置來當前應用使用的線程池的容量,這樣的設置需要根據當前的負載進行調整,所以需要很高的時效性,我們希望一旦修改了JSON文件的配置,應用程式中針對線程池的相關設置可以立即生效。簡單起見,我們僅僅定義MinThreads 和MaxThreads這兩個分別決定線程池容量區間的配置項,如下所示的ThreadPoolOptions是對應的Options類型。

  1: public class ThreadPoolOptions

  2: {

  3: public int MinThreads { get; set; }

  4: public int MaxThreads { get; set; }

  5:

  6: public override string ToString()

  7: {

  8: return $"Thread pool size: [{MinThreads}, {MaxThreads}]";

  9: }

  10: }

  我們在項目中添加一個名為threadPool.json的文件來定義線程池的配置。除此之外,我們需要通過修改project.json與編譯相關的配置讓該文件在編譯的時候自動拷貝到輸出目錄下(預設為bin目錄)。具體來說,我們只需要按照如下的方式將該文件的路徑設置為“builtOptions/copyToOutput”配置選購的值就可以了。

我們只需要按照如下的方式將該文件的路徑設置為“builtOptions/copyToOutput”配置選購的值就可以了。

 

  1: {

  2: ...

  3: "buildOptions": {

  4: ...

  5: "copyToOutput": "threadPool.json"

  6: }

  7: }

  接下來我們編寫瞭如下一段程式來演示應用中使用的配置如何與配置文件的內容保持同步。我們首先創建了一個ConfigurationBuilder對象,併在它上面註冊了一個JsonConfigurationSource。在創建這個JsonConfigurationSource對象的時候,除了指定配置文件(“threadPool.json”)的路徑之外,我們還將它的ReloadOnChange屬性設置為True。顧名思義,這個ReloadOnChange屬性的含義就是當原始配置文件的內容發生改變的時候是否需要重新載入配置。

 

這個ReloadOnChange屬性的含義就是當原始配置文件的內容發生改變的時候是否需要重新載入配置。

 

  在利用ConfigurationBuilder得到Configuration對象之後,我們調用它的GetReloadToken方法得到一個ChangeToken對象,後者會幫助我們判斷配置是否被重新載入。我們調用ChangeToken類型的靜態方法OnChange為這個ChangeToken對象註冊了一個回調,該回調會在配置被重新載入時自動執行。至於這個註冊的回調,我們僅僅是採用Options模式得到配置綁定生成的ThreadPoolOptions對象,並將它的相關信息列印在控制臺上。

  在這段程式的最後,我們在一個無限迴圈中以5秒鐘的間隔對threadPool.json文件進行更新。按照這段程式的意圖,當我們每次完成了針對threadPool.json的更新之後,我們創建的Configuration對象會自動重新載入。Configuration一旦重新載入,之前調用它的GetReloadToken方法得到ChangeToken對象的HasChanged屬性將變成True,註冊在它上面的回調將被執行。所以最終的結果就是重新設置的配置會實時出現在控制臺上,如下所示的輸出結果證實了這一點。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • C#編寫的代碼屬於跨平臺的托管代碼,C++語言可以編寫托管(managed)和非托管(native)代碼。在C#與C++的混合編程中,經常會使用C#來調用native C++的DLL,下麵有兩種常用的調用方法供大家參考。 使用P/Invoke直接調用native C++ Dll裡面的函數。(註:此方 ...
  • 這是我在博客園的第一遍文章,想分享下lambda表達式轉換sql。喜歡EF的便捷與優雅,不喜歡生成的一坨sql。(PS:公司封裝了一套訪問資料庫的方法,所以不確定是不是EF的問題,反正就是一坨密密麻麻的的sql,我有點點處女座小糾結,雖然我是天蝎座)好了,廢話少說。 using System;usi ...
  • 一.通過導圖的方法快速去理解springmvc的原理 二.架構流程。 1、 用戶發送請求至前端控制器DispatcherServlet 2、 DispatcherServlet收到請求調用HandlerMapping處理器映射器。 3、 處理器映射器根據請求url找到具體的處理器,生成處理器對象及處 ...
  • 廢話不多說,直接上步驟。 1、文件準備 下載皮膚文件,將解壓後的Skinssk文件夾放在程式根目錄(bin\\debug)下。 皮膚文件下載地址:http://pan.baidu.com/s/1slSAqFN 2、添加工程引用 右鍵引用->點擊添加引用->瀏覽->選擇剛剛放在debug目錄下Skin ...
  • Create a web API with ASP.NET Core MVC and Visual Studio for Windows 在windows上用vs與asp.net core mvc 創建一個 web api 程式 2017-5-24 8 分鐘閱讀時長 本文內容 1.Overview ...
  • 首先對 Center 進行一個簡單的佈局 然後就是在js裡面完成tabs的點擊事件實現了 其實center就是在div裡面嵌入了一個iframe,所以最後返回的就是一個iframe 這裡需要註意一點就是上面的detail是導航欄的類選擇器的值(這裡的class一定要一樣) 整個頁面代碼 ...
  • ef中,我們創建外鍵的時候需要註意,否則會出現標題所示問題。 例:有項目表,項目收藏表,用戶表 項目表有如下欄位:ProjectId,InputPersonId等 項目收藏表有如下欄位:ProjectId,UseId等 用戶表有如下欄位:用戶id等 項目表: 項目收藏表: 用戶表: 分析一下,假如刪 ...
  • 我們先來簡單瞭解一下WinForm和FarPoint,WinForm是·Net開發平臺中對Windows Form的一種稱謂。而FarPoint是一款模擬EXCEL的控制項。它可以根據用戶的要求實現很大部份的EXCEL操作,且包括多個子表、表格風格定義、公式計算、排序、分組等等都可以實現。本文主要是介 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...