溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

如何在.NET Core微服務(wù)中使用HostBuilder和Generic Host

發(fā)布時(shí)間:2021-07-24 15:20:31 來(lái)源:億速云 閱讀:219 作者:chen 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“如何在.NET Core微服務(wù)中使用HostBuilder和Generic Host”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

介紹

自ASP.NET Core 1.0發(fā)布以來(lái),我們有了WebHostBuilder類(lèi),它允許我們配置和構(gòu)建WebHost。然后,當(dāng)服務(wù)器(Kestrel)接受并處理HTTP請(qǐng)求時(shí),它將處理應(yīng)用程序的生命周期。在ASP.NET Core 2.0中,WebHostBuilder得到了一些進(jìn)一步的改進(jìn)和簡(jiǎn)化。WebHostBuilder允許我們執(zhí)行諸如使用依賴(lài)注入容器來(lái)配置服務(wù)的事情; 通常是由Microsoft提供的作為ASP.NET Core一部分的容器。WebHostBuilder還允許我們將來(lái)自多個(gè)源的配置加載到鍵/值對(duì)的最終配置表示中。

對(duì)于ASP.NET Core Web應(yīng)用程序來(lái)說(shuō),這些工作非常好,但是到目前為止,在其他類(lèi)型的應(yīng)用程序的框架中沒(méi)有類(lèi)似的選項(xiàng)!

注意:請(qǐng)記住,這篇文章是基于ASP.NET Core 2.1預(yù)覽版1發(fā)布的。因此,在公開(kāi)預(yù)覽期間以及在最終發(fā)布2.1之前,事情可能會(huì)根據(jù)預(yù)覽期間收到的反饋進(jìn)行更改。

介紹IHost和HostBuilder

使用.NET Core 2.1的開(kāi)發(fā)人員可以使用的新選項(xiàng)是新的“通用”主機(jī),它使開(kāi)發(fā)人員能夠輕松設(shè)置橫切關(guān)注點(diǎn),例如針對(duì)非Web焦點(diǎn)應(yīng)用程序的日志記錄,配置和依賴(lài)注入。團(tuán)隊(duì)已經(jīng)認(rèn)識(shí)到,將主機(jī)綁定到HTTP的關(guān)注可能不是一個(gè)理想的解決方案,因?yàn)槠渲性S多這些東西是其他應(yīng)用程序類(lèi)型的通用要求。

可以使用這個(gè)地方的一個(gè)例子是在需要運(yùn)行后臺(tái)處理任務(wù)的控制臺(tái)應(yīng)用程序中,例如可能處理隊(duì)列中的消息。現(xiàn)在,這些類(lèi)型的服務(wù)在基于云的本地基于容器的體系結(jié)構(gòu)中很常見(jiàn)。

在.NET Core的當(dāng)前2.0版本中,當(dāng)然可以在控制臺(tái)應(yīng)用程序中使用日志記錄,配置和DI庫(kù)。在工作中,我們有許多微服務(wù),它們處理來(lái)自隊(duì)列的消息和數(shù)據(jù)豐富任務(wù)。我們必須自己手動(dòng)包含和設(shè)置這些常見(jiàn)問(wèn)題。雖然這是可能的,但在應(yīng)用程序中設(shè)置DI設(shè)置之類(lèi)的東西需要一些管道。

 建立一個(gè)主機(jī)

要?jiǎng)?chuàng)建主機(jī),我們可以使用新的HostBuilder,它具有與現(xiàn)有WebHostBuilder類(lèi)似的一組方法和擴(kuò)展。因此,使用ASP.NET Core的任何人都應(yīng)該熟悉這些模式。

有一個(gè)主要的區(qū)別需要注意。HostBuilder不提供擴(kuò)展方法,允許您像使用WebHostBuilder一樣使用啟動(dòng)類(lèi)。這個(gè)決定主要是為了避免在幕后創(chuàng)建兩個(gè)獨(dú)立的DI容器。使用通用主機(jī),配置單個(gè)服務(wù)集合,然后用于構(gòu)建最終服務(wù)提供者。

在您的應(yīng)用程序的Main方法中,您可以先創(chuàng)建一個(gè)HostBuilder,然后使用擴(kuò)展方法向DI注冊(cè)服務(wù),讀取配置并配置您的應(yīng)用程序所需的日志記錄。

解釋該功能的最佳方式是舉一個(gè)例子。如果你想查看完整的示例代碼,你可以從GitHub中獲取它。

如果我們看看這個(gè)控制臺(tái)應(yīng)用程序的Main方法,我們可以探索為我們的應(yīng)用程序創(chuàng)建一個(gè)Host。

如果您已經(jīng)使用過(guò)ASP.NET Core,并且已經(jīng)看到了WebHost構(gòu)建器,特別是在1.0時(shí)間框架中,這看起來(lái)可能非常熟悉。我們首先創(chuàng)建一個(gè)HostBuilder,然后我們可以使用它來(lái)定義我們想要?jiǎng)?chuàng)建的主機(jī)。本例中的第一個(gè)方法是ConfigureAppConfiguration方法。這個(gè)方法允許我們配置應(yīng)該使用哪個(gè)配置提供者來(lái)為我們的應(yīng)用程序構(gòu)造配置值的最終表示。

這與使用WebHostBuilder時(shí)可以自定義配置的方式相同。在這個(gè)例子中,我們已經(jīng)說(shuō)過(guò),我們希望首先從appsettings.json文件中讀取配置值,然后是環(huán)境變量,最后是傳遞到應(yīng)用程序中的任何參數(shù)。

接下來(lái)我們調(diào)用ConfigureServices,就像WebHostBuilder一樣,允許我們用ServiceCollection注冊(cè)服務(wù)。使用ServiceCollection上的擴(kuò)展方法執(zhí)行注冊(cè),一旦完成,將使我們能夠在我們的應(yīng)用程序中有DI可用的任何地方獲取這些注冊(cè)的實(shí)例。

在這種情況下,第一個(gè)添加了ASP.NET Core Options服務(wù),第二個(gè)為IOptions綁定設(shè)置了注冊(cè)。最后的服務(wù)注冊(cè)是我稍后會(huì)談到的。

最后一節(jié),ConfigureLogging如你所期望的那樣設(shè)置應(yīng)用程序的日志記錄。在這種情況下,我們添加控制臺(tái)日志記錄,它使用應(yīng)用程序配置中的值來(lái)確定要記錄的內(nèi)容。

本示例中的日志記錄配置與使用模板創(chuàng)建的默認(rèn)ASP.NET Core Web應(yīng)用程序中的配置相同。

最后一步是在構(gòu)建和啟動(dòng)應(yīng)用程序的HostBuilder上調(diào)用RunConsoleAsync。它會(huì)一直運(yùn)行,直到CTRL + C被用來(lái)觸發(fā)它關(guān)閉。

完成任務(wù)

如果我們把它留在這里,服務(wù)就不會(huì)太好。此時(shí)我們只是運(yùn)行一個(gè)控制臺(tái)應(yīng)用程序,但實(shí)際上并沒(méi)有做任何有用的事情。因此我們需要一種方法來(lái)定義應(yīng)用程序應(yīng)該執(zhí)行的工作。

為這種服務(wù)風(fēng)格推薦的模式是利用新的IHostedService功能,首先在ASP.NET Core 2.0中引入。

這里我們有一個(gè)基本的IHostedService實(shí)現(xiàn),它將在這個(gè)服務(wù)中運(yùn)行...

我不會(huì)深入研究這些代碼,但我會(huì)總結(jié)一下它在做什么。當(dāng)應(yīng)用程序啟動(dòng)時(shí),它將在此服務(wù)上調(diào)用StartAsync。在該方法中,我們創(chuàng)建了一個(gè)每5秒鐘執(zhí)行一次工作的定時(shí)器。

作品本身在DoWork中定義。這里只是用戶(hù)將ILogger記錄為信息。這包括從應(yīng)用程序配置中檢索的消息。這是通過(guò)DI傳遞給服務(wù)的IOptions對(duì)象訪問(wèn)的。

在關(guān)機(jī)時(shí),StopAsync被調(diào)用,服務(wù)在應(yīng)用程序被終止之前清理一點(diǎn)。這是一個(gè)非常人為的例子,但我想簡(jiǎn)單地把事情放在一起,并專(zhuān)注于這些部分如何組合在一起。

通過(guò)定義IHostedService實(shí)現(xiàn),我們只需使用ConfigureServices中的以下常見(jiàn)操作(我們?cè)谇懊婵吹剑⑵渥?cè)到DI容器。

services.AddSingleton<IHostedService, PrintTextToConsoleService>();

如果我們需要在此服務(wù)中運(yùn)行各種東西,我們可以添加多個(gè)托管服務(wù)。

概要

使用這種新的“通用”主機(jī)概念有很多情況。在這篇文章中,我們已經(jīng)探索了一個(gè)非常基本的例子,但是我不需要太多的工作來(lái)簡(jiǎn)化我們環(huán)境中的一些微服務(wù)。對(duì)于Web應(yīng)用程序和服務(wù)有一個(gè)通用模式,并且可以輕松訪問(wèn)DI,日志記錄和配置等特性,這是非常受歡迎的。

“如何在.NET Core微服務(wù)中使用HostBuilder和Generic Host”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI