《ASP.NET Core 6框架揭秘》實例演示[22]:如何承載你的后臺服務[補充]

借助 .NET提供的服務承載(Hosting)系統,我們可以將一個或者多個長時間運行的后臺服務寄宿或者承載我們創建的應用中。任何需要在后臺長時間運行的操作都可以定義成標準化的服務并利用該系統來承載,ASP.NET Core應用最終也體現為這樣一個承載服務。[本文節選《ASP.NET Core 6框架揭秘》第14章]

[S1407]利用IHostApplicationLifetime對象關閉應用(源代碼)
[S1408]與第三方依賴注入框架的整合(源代碼)
[S1409]利用配置初始化承載環境(源代碼)

[S1407]利用IHostApplicationLifetime對象關閉應用

我們接下來通過一個簡單的實例演示如何利用IHostApplicationLifetime服務來關閉整個承載應用。我們在一個控制臺應用程序中定義了如下這個承載服務類型FakeHostedService,并在其構造函數中注入了IHostApplicationLifetime服務。在得到其三個屬性返回的CancellationToken對象之后,我們在它們上面分別注冊了一個回調在控制臺輸出相應的文字。

public?sealed?class?FakeHostedService?:?IHostedService
{private?readonly?IHostApplicationLifetime?_lifetime;private?IDisposable??_tokenSource;public?FakeHostedService(IHostApplicationLifetime?lifetime){_lifetime?=?lifetime;_lifetime.ApplicationStarted.Register(()?=>?Console.WriteLine("[{0}]Application?started",?DateTimeOffset.Now));_lifetime.ApplicationStopping.Register(()?=>?Console.WriteLine("[{0}]Application?is?stopping.",?DateTimeOffset.Now));_lifetime.ApplicationStopped.Register(()?=>?Console.WriteLine("[{0}]Application?stopped.",?DateTimeOffset.Now));}public?Task?StartAsync(CancellationToken?cancellationToken){_tokenSource?=?new?CancellationTokenSource(TimeSpan.FromSeconds(5)).Token.Register(_lifetime.StopApplication);return?Task.CompletedTask;}public?Task?StopAsync(CancellationToken?cancellationToken){_tokenSource?.Dispose();return?Task.CompletedTask;}
}

在實現的StartAsync方法中,我們采用如上的方式在等待5秒之后調用IHostApplicationLifetime對象的StopApplication方法關閉應用程序。FakeHostedService服務最后采用如下所示的方式承載于當前應用程序中。

using?App;
Host.CreateDefaultBuilder(args).ConfigureServices(svcs?=>?svcs.AddHostedService<FakeHostedService>()).Build().Run();

該程序運行之后在控制臺上輸出的結果如圖1所示,從三條消息輸出的時間間隔可以確定當前應用程序正是承載FakeHostedService通過調用IHostApplicationLifetime服務的StopApplication方法關閉的。

7821d61e5816411facdce7a0496fe1a6.png
圖1 調用IHostApplicationLifetime服務關閉應用程序

[S1408]與第三方依賴注入框架的整合

《一個Mini版的依賴注入框架》中創建了一個名為Cat的簡易版依賴注入框架,并在《與第三方依賴注入框架Cat的整合》中為其創建了一個IServiceProviderFactory<TContainerBuilder>實現類型,具體類型為CatServiceProvider,我們接下來演示一下如何通過注冊CatServiceProvider實現與Cat這個第三方依賴注入框架的整合。在創建的演示程序中,我們采用這樣的方式定義了三個服務(Foo、Bar和Baz)和對應的接口(IFoo、IBar和IBaz),并在服務類型上標注MapToAttribute特性來定義服務注冊信息。

public?interface?IFoo?{?}
public?interface?IBar?{?}
public?interface?IBaz?{?}[MapTo(typeof(IFoo),?Lifetime.Root)]
public?class?Foo?:??IFoo?{?}[MapTo(typeof(IBar),?Lifetime.Root)]
public?class?Bar?:??IBar?{?}[MapTo(typeof(IBaz),?Lifetime.Root)]
public?class?Baz?:??IBaz?{?}

如下所示的FakeHostedService類型表示承載的服務。我們在構造函數中注入了IFoo、IBar和IBaz對象,構造函數提供的調試斷言用于驗證上述三個服務被成功注入。

public?sealed?class?FakeHostedService:?IHostedService
{public?FakeHostedService(IFoo?foo,?IBar?bar,?IBaz?baz){Debug.Assert(foo?!=?null);Debug.Assert(bar?!=?null);Debug.Assert(baz?!=?null);}public?Task?StartAsync(CancellationToken?cancellationToken)?=>?Task.CompletedTask;public?Task?StopAsync(CancellationToken?cancellationToken)?=>?Task.CompletedTask;
}

我們在如下的演示程序中創建了一個IHostBuilder對象,通過調用其ConfigureServices方法注冊了需要承載的FakeHostedService服務后,我們調用它的UseServiceProviderFactory方法完成了對CatServiceProvider的注冊。我們隨后調用了CatBuilder的Register方法完成了針對入口程序集的批量服務注冊。調用IHostBuilder的Build方法構建出作為宿主的IHost對象并啟動它之后,承載的FakeHostedService服務將自動被創建并啟動。

using?App;
using?System.Reflection;Host.CreateDefaultBuilder().ConfigureServices(svcs?=>?svcs.AddHostedService<FakeHostedService>()).UseServiceProviderFactory(new?CatServiceProviderFactory()).ConfigureContainer<CatBuilder>(builder?=>?builder.Register(Assembly.GetEntryAssembly()!)).Build().Run();

[S1409]利用配置初始化承載環境

一個HostBuilderContext上下文由承載針對宿主配置的IConfiguration對象和描述當前承載環境的IHostEnvironment對象組成,后者提供的環境名稱、應用名稱和內容文件根目錄路徑可以通過前者來指定,具體的配置項名稱定義在如下這個靜態類型HostDefaults中。

public?static?class?HostDefaults
{public?static?readonly?string?EnvironmentKey?=?"environment";public?static?readonly?string?ContentRootKey?=?"contentRoot";public?static?readonly?string?ApplicationKey?=?"applicationName";
}

下面我們通過一個簡單的實例演示如何利用配置的方式來指定上述三個與承載環境相關的屬性。我們定義了如下一個名為FakeHostedService的承載服務,并在構造函數中注入IHostEnvironment對象。FakeHostedService派生于抽象類BackgroundService,我們在在ExecuteAsync方法中將與承載環境相關的環境名稱、應用名稱和內容文件根目錄路徑輸出到控制臺上。

public?class?FakeHostedService?:?BackgroundService
{private?readonly?IHostEnvironment?_environment;public?FakeHostedService(IHostEnvironment?environment)?=>?_environment?=?environment;protected?override?Task?ExecuteAsync(CancellationToken?stoppingToken){Console.WriteLine("{0,-15}:{1}",?nameof(_environment.EnvironmentName),?_environment.EnvironmentName);Console.WriteLine("{0,-15}:{1}",?nameof(_environment.ApplicationName),_environment.ApplicationName);Console.WriteLine("{0,-15}:{1}",?nameof(_environment.ContentRootPath),_environment.ContentRootPath);return?Task.CompletedTask;}
}

FakeHostedService采用如下形式進行承載。如代碼片段所示,為了避免輸出日志的“干擾”,我們調用IHostBuilder接口的ConfigureLogging擴展方法將注冊的ILoggerProvider對象全部清除。如果調用Host靜態類型的CreateDefaultBuilder方法時傳入當前的命令行參數,創建的IHostBuilder對象會將其作為配置源,所以我們就能以命令行參數的形式來指定承載上下文的三個屬性。

using?App;
Host.CreateDefaultBuilder(args).ConfigureLogging(logging?=>logging.ClearProviders()).ConfigureServices(svcs?=>?svcs.AddHostedService<FakeHostedService>()).Build().Run();

我們采用命令行的方式啟動這個演示程序,并利用傳入的命令行參數指定環境名稱、應用名稱和內容文件根目錄路徑(確保路徑確實存在)。圖2所示的輸出結果表明,應用程序當前的承載環境與基于宿主的配置是一致的。

76d87157354a3650d7b0ca8f39406b64.png
圖2 利用配置來初始化承載環境

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/282923.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282923.shtml
英文地址,請注明出處:http://en.pswp.cn/news/282923.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

命令行打印文件樹列表: tree

Linux & Mac 1.下載tree lib //mac brew install tree //centos yum install tree //ubuntu apt-get install tree 用法 //顯示所有文件 tree //顯示深度2層 tree -L 2 2. 命令find組合 find . -print | sed -e s;[^/]*/;|____;g;s;____|; |;g > structure.txt 移除node…

java 二分法查找數組,Java二分法查找數組元素下標

package pers.ly.javase.algorithm;import java.util.Arrays;/*** 二分法查找* author: Lu Yang* date: 2019-01-23 10:50:37**/public class BinarySearch {public static void main(String[] args) {Integer[] arr {10,50,30,40,10,80,90,70,60,40,100,10};// 數組排序 ->…

ASP.NET Core MVC壓縮樣式、腳本及總是復制文件到輸出目錄

前言 在.NET Core之前對于壓縮樣式文件和腳本我們可能需要借助第三方工具來進行壓縮&#xff0c;但在ASP.NET MVC Core中則無需借助第三方工具來完成&#xff0c;本節我們來看看ASP.NET Core MVC為我們提供了哪些方便。 自動壓縮樣式和腳本 當我們在測試環境中肯定不需要壓縮腳…

京東訂單自動評價方法

剛剛完成的一個京東自動訂單腳本, 以后還要加入其它京東自動的腳本項目地址: https://github.com/mm333444/aox_jd_auto_script 京東自動完成腳本 目前只完成京東訂單自動評價, 評價時會自動上傳商品圖片 一、安裝 1. 程序依賴 python3.52. 安裝配置 安裝pipenv安裝模塊 pipenv…

matlab空間散點擬合曲線,matlab離散點擬合曲線

matlab曲線擬合與數值點標注實例_工程科技_專業資料。實例 1: 現已知兩組...Matlab教程 曲線擬合工具箱 數學科學與技術學院 胡金燕 lionfr 曲線擬合定義 在實際工程應用和科學實踐中,經常需要尋求 兩個(或多個)變量間的關系,而......(p,x); %獲得x點處對相應的y值 plot(x,y,r*…

redis下并發問題解決方案

http://effective.blog.51cto.com/8296150/1671743 現在的計算機大都是多核的cpu,意味著可以并行執行多個進程.如果這多個運行的進程對同一份數據進行讀寫操作,那么就有可能出現兩個或者多個進程讀到的都是老的數據,這種情況下,再進行寫入操作之后就會有一些進程寫入的數據被覆…

宜建立自主可控的車用芯片和操作系統技術體系

萬物互聯時代&#xff0c;操作系統的邊界在不斷突破&#xff0c;面向“人機物”融合的泛在計算場景&#xff0c;能夠支撐分布式人機物協同應用的操作系統將是產業未來之光。操作系統在經過主機時代、PC互聯時代、移動互聯時代之后&#xff0c;來到萬物互聯時代&#xff0c;這恰…

Java 9進入第一輪問題修復階段

Java 9功能特性正式完成&#xff0c;這意味著第一個問題修復階段已經開始。HTTP/2客戶端沒有在截止日期前完成&#xff0c;現已降級為孵化器功能。由于現在的目標是在7月準備好可發布的Java 9&#xff0c;所以目前不太可能添加任何新的JEP。\\InfoQ此前的報道中提到&#xff0c…

django 用戶管理(1)

編輯了前端的頁面展示&#xff0c;用的bootstrap 用戶登錄 用戶信息 用戶編輯 創建用戶 修改密碼 轉載于:https://blog.51cto.com/jacksoner/2133129

qiaoye.php,全自動無限生成關鍵詞頁面(黑帽SEO優化終極方法)

如果你是做黑帽SEO的&#xff0c;如果你還停留在用欄目、租域名、劫持等手段來做黑帽SEO優化&#xff0c;我可以肯定的告訴你&#xff0c;你做的再好&#xff0c;也賺不了多少。那么今天咱們要說的就是無限生成關鍵詞頁面用內容頁來做黑帽SEO優化。這是我在演示的時候做的一個站…

AR Software

... 轉載于:https://www.cnblogs.com/2008nmj/p/7264769.html

v1.0.25 新版發布及Smart Meetup重新開啟丨SmartIDE

作者&#xff1a;徐磊文章首發地址&#xff1a;https://smartide.cn/zh/blog/2022-0892-sprint25/關于SmartIDESmartIDE是一群開發者為所有開發者開發的開源云原生IDE&#xff0c;我們的使命是“為開發者賦予云原生的超能力”&#xff01;使用SmartIDE你只需要學會一個簡單的指…

線程安全的單例模式

面試的時候&#xff0c;常常會被問到這樣一個問題&#xff1a;請您寫出一個單例模式&#xff08;Singleton Pattern&#xff09;吧。好吧&#xff0c;寫就寫&#xff0c;這還不容易。順手寫一個&#xff1a; public final class EagerSingleton { private static EagerSi…

vue實現首屏加載等待動畫 避免首次加載白屏尷尬

為什么80%的碼農都做不了架構師&#xff1f;>>> 0 直接上效果圖 1背景&#xff0c;用戶體驗良好一直是個重要的問題。 2怎么加到自己項目里面&#xff1f; 復制css html代碼到自己的index.html即可 代碼鏈接 源碼地址 Vue學習前端群493671066&#xff0c;美女多多。…

java-回調機制詳解

轉&#xff1a;http://blog.csdn.net/llayjun/article/details/50454148 閱讀目錄 一、前言二、回調的含義和用途三、Java實現接口回調 四、Android中的接口回調五、參考資料一、前言 最近在看android fragment與Activity進行數據傳遞的部分&#xff0c;看到了接口回調的內容&a…

lfi讀取php,php LFI讀php文件源碼以及直接post webshell

php LFI讀php文件源碼以及間接post 網站shell假如如下一個場景(&#xff11;) http://vulnerable/fileincl/example&#xff11;.php?pageintro.php(該php文件包孕LFI漏洞)(&#xff12;) 然而你不有中央能夠upload你的網站shell代碼(三) LFI只能讀取到非php文件的源碼(由于無…

根據請求上下文動態設置靜態文件存儲目錄

前言上次&#xff0c;我們實現了根據 subpath 特定格式《動態設置靜態文件存儲目錄》。例如&#xff1a;subpath靜態文件路徑/userAId/1.jpgc:\abc\userAId\1.jpg/userBId/1.jpgd:\xyz\123\userBId\1.jpg但是&#xff0c;如果 subpath 不能有這種特定格式&#xff0c;只能用通用…

BZOJ3019 : [Balkan2012]handsome

首先預處理出$f[i][j][k]$表示長度為$i$的序列&#xff0c;第一個位置是$j$&#xff0c;最后一個位置是$k$時合法的方案數。 從后往前枚舉LCP以及那個位置應該改成什么。 用線段樹維護區間內最左最右的已經確定的位置&#xff0c;以及區間內的合法方案數。 合并的時候只需要將左…

php smarty入門,smarty 快速入門

smarty 快速入門smarty定義:一個開源的模板引擎模板引擎是為了使用戶界面與業務數據分離而產生的&#xff0c;它可以生成特定格式的文檔&#xff0c;用于網站的模板引擎就會生成一個標準的HTML文檔。功能將網站的數據和網站的界面實現分離(php和html代碼)緩存頁面下載www.smart…

ImageView的scaleType理解

2019獨角獸企業重金招聘Python工程師標準>>> 1.android:scaleType“center” 保持原圖的大小&#xff0c;顯示在ImageView的中心。當原圖的size大于ImageView的size時&#xff0c;多出來的部分被截掉。 2.android:scaleType“center_inside” 以原圖正常顯示為目的&…