1. 程式人生 > >net core 的Generic Host 之Generic Host Builder

net core 的Generic Host 之Generic Host Builder

前言

通用Host(Generic Host) 與 web Host 不同的地方就是通用Host解耦了Http請求管道,使得通用Host擁有更廣的應用場景。比如:訊息收發、後臺任務以及其他非http的工作負載。這些場景都可以通過使用通用Host擁有橫切(Cross-cutting)的能力,比如:配置、依賴注入和日誌記錄。
***

Generic Host Builder

Asp net core 2.1版本推出了Generic Host Builder,但它僅僅用在了非http工作負載的場景,Generic Host Builder會在2019年釋出的3.0版本中替換掉Web Host Builder。

2.x中的Generic Host Builder

asp net core 2.1沒有使用Generic Host Builder,那麼它的使用場景是什麼呢?Generic Host Builder的在非http負載的使用場景有訊息收發、後臺任務等。
HostBuilder位於 Microsoft.Extensions.Hosting 名稱空間下,實現了IHostBUilder介面。Net core 應用在Main()中最簡單的用法如下:

public static async Task Main(string[] args)
{
   var host = new HostBuilder()
      .Build(); 

   await host.RunAsync();
}

Build()方法是初始化host例項,它僅僅能被呼叫一次,在Build()方法執行前呼叫ConfigureServices()方法可以用來配置host。

var host = new HostBuilder()
   .ConfigureServices((hostContext, services) =>
   {
      services.Configure<HostOptions>(option =>
      {
         // option.SomeProperty = ...
      });
   })
   .Build();

ConfigureServices((hostContext, services) 方法有一個HostBuilderContext引數和一個依賴注入的IServiceCollection引數。你也可以通過呼叫Configure()設定Host的其他設定,當前HostOptions物件只有一個Shutdown Timeout 屬性。

你可以在官方示例看到更多的配置,下面是一個其中的程式碼片段:

Host 配置部分

.ConfigureHostConfiguration(configHost =>
{
   configHost.SetBasePath(Directory.GetCurrentDirectory());
   configHost.AddJsonFile("hostsettings.json", optional: true);
   configHost.AddEnvironmentVariables(prefix: "PREFIX_");
   configHost.AddCommandLine(args);
})

應用配置部分

.ConfigureAppConfiguration((hostContext, configApp) =>
{
   configApp.AddJsonFile("appsettings.json", optional: true);
   configApp.AddJsonFile(
      $"appsettings.{hostContext.HostingEnvironment.EnvironmentName}.json", 
      optional: true);
   configApp.AddEnvironmentVariables(prefix: "PREFIX_");
   configApp.AddCommandLine(args);
})

依賴注入程式碼

.ConfigureServices((hostContext, services) =>
{
   services.AddHostedService<LifetimeEventsHostedService>();
   services.AddHostedService<TimedHostedService>();
})

日誌配置程式碼

.ConfigureLogging((hostContext, configLogging) =>
{
   configLogging.AddConsole();
   configLogging.AddDebug();
})

3.0web應用中的Generic Host Builder

Asp net core 3.0 中使用Generic Host Builder 替換 Web Host Builder,net core 3.0 web 應用在Main函式中簡單的使用方式程式碼如下:

public static void Main(string[] args)
{
   CreateHostBuilder(args)
      .Build()
      .Run();
}

public static IHostBuilder CreateHostBuilder(string[] args) =>
   Host.CreateDefaultBuilder(args)
      ConfigureWebHostDefaults(webBuilder =>
      {
         webBuilder.UseStartup<Startup>();
      });

3.0版本中的CreateHostBuilder方法與2.x版本的 CreateWebHostBuilder() 方法很相似,二者最大的不同就是WebHost.CreateDefaultBuilder() 被替換成 Host.CreateDefaultBuilder(),
還有一個不同的地方就是 Host.CreateDefaultBuilder()方法,因為新版本的host builder是一個通用的host builder,這樣就要通過嗲用 CreateDefaultBuilder()方法來構建一個web app host。

最後

未來我們需要知道:

  • WebHostBuilder在未來將會被棄用
  • IWebHostBuilder介面將會被保留
  • 你不能在Startup類裡面注入任何服務,IHostingEnvironment and IConfiguration除外

參考連結

官方文件
Generic Host Builder in ASP .NET Core

相關推薦

.NET Core 3.0 初識Host原始碼

寫在前面 ASP .NET Core中的通用主機構建器是在v2.1中引入的,應用在啟動時構建主機,主機作為一個物件用於封裝應用資源以及應用程式啟動和生存期管理。其主要功能包括配置初始化(包括載入配置以及配置轉換為通用的鍵值對格式),建立託管環境和Host通用上下文、依賴注入等。 在.NET Core 3.

net coreGeneric Host Generic Host Builder

前言 通用Host(Generic Host) 與 web Host 不同的地方就是通用Host解耦了Http請求管道,使得通用Host擁有更廣的應用場景。比如:訊息收發、後臺任務以及其他非http的工作負載。這些場景都可以通過使用通用Host擁有橫切(Cross-cutting)的能力,比如:配置、依賴注入

.NET Core 3.0深入原始碼理解Host(二)

  寫在前面 停了近一個月的技術部落格,隨著正式脫離996的魔窟,接下來也正式恢復了。本文從原始碼角度進一步討論.NET Core 3.0 中關於Host擴充套件的一些技術點,主要討論Long Run Program的建立與守護。 關於Host,我們最容易想到的就是程式的啟動與停止,而其中隱藏著非常

.NET Core容器化多容器應用部署-使用Docker-Compose

gre server rebuild asp ack 進行 add view created 1.引言 緊接上篇.NET Core容器化@Docker,這一節我們先來介紹如何使用Nginx來完成.NET Core應用的反向代理,然後再介紹多容器應用的部署問題。 2.

NET Core應用框架BitAdminCore框架應用篇系列

net EDA clas IE span targe slist target nco BitAdminCore是基於NET Core2.0的後端快速開發框架,本篇主要目標是介紹如何使用框架開發應用。框架的一些特性等。 系列鏈接 BitAdminCore框架應用

.NET Core微服務基於Consul實現服務治理

請求轉發 1.0 asp.net AC port prefix 我們 tle nan 一、Consul基礎介紹   Consul是HashiCorp公司推出的開源工具,用於實現分布式系統的服務發現與配置。與其他分布式服務註冊與發現的方案,比如 Airbnb的Smart

.NET Core微服務基於Consul實現服務治理(續)

shell pla code tst 分層 編輯 set req \n 上一篇發布之後,這一篇把上一篇沒有弄到的東西補一下,也算是給各位前來詢問的朋友的一些回復吧。一、Consul服務註冊之配置文件方式1.1 重溫Consul實驗集群  這裏我們有三個Consul Serv

.net core實踐系列SSO-跨域實現

mes app dem .data let nco 具體步驟 field dir 前言 接著上篇的《.net core實踐系列之SSO-同域實現》,這次來聊聊SSO跨域的實現方式。這次雖說是.net core實踐,但是核心點使用jquery居多。 建議看這篇文章的朋友可

.net core實踐系列SSO-跨域實現 .net core實踐系列SSO-同域實現 .net core實踐系列SSO-同域實現

前言 接著上篇的《.net core實踐系列之SSO-同域實現》,這次來聊聊SSO跨域的實現方式。這次雖說是.net core實踐,但是核心點使用jquery居多。 建議看這篇文章的朋友可以先看上篇《.net core實踐系列之SSO-同域實現》做一個SSO大概瞭解。 原始碼地址:https://git

.net core 微服務Api閘道器(Api Gateway)

微服務閘道器目錄 1、 微服務引子 2、使用Nginx作為api閘道器 3、自創api閘道器(重複輪子) 3.1、構建初始化 3.2、構建中介軟體 4、結語

.NET Core實戰專案CMS 第三章 入門篇-原始碼解析配置檔案及依賴注入

作者:依樂祝 原文連結:https://www.cnblogs.com/yilezhu/p/9998021.html 寫在前面 上篇文章我給大家講解了ASP.NET Core的概念及為什麼使用它,接著帶著你一步一步的配置了.NET Core的開發環境並建立了一個ASP.NET Core的mvc專

.NET Core實戰專案CMS 第四章 入門篇-Git的快速入門及實戰演練

寫在前面 上篇文章我帶著大家通過分析了一遍ASP.NET Core的原始碼瞭解了它的啟動過程,然後又帶著大家熟悉了一遍配置檔案的載入方式,最後引出了依賴注入以及控制反轉的概念!如果大家把前面幾張都理解了,那麼你也就入了ASP.NET Core的大門了。但是我們還需要一個版本控制工具來提高我們的編碼效率。因此

.NET Core實戰專案CMS 第二章 入門篇-快速入門ASP.NET Core看這篇就夠了

作者:依樂祝 原文連結:https://www.cnblogs.com/yilezhu/p/9985451.html 本來這篇只是想簡單介紹下ASP.NET Core MVC專案的(畢竟要照顧到很多新手朋友),但是轉念一想不如來點猛的(考慮到急性子的朋友),讓你通過本

.NET Core實戰專案CMS 第一章 入門篇-開篇及總體規劃

作者:依樂祝 原文地址:https://www.cnblogs.com/yilezhu/p/9977862.html 寫在前面 千呼萬喚始出來,首先,請允許我長吸一口氣!真沒想到一份來自28歲老程式設計師的自白 這篇文章會這麼火,更沒想到的是

基於Apollo實現.NET Core微服務統一配置(測試環境-單機) .NET Core微服務基於Apollo實現統一配置中心

一、前言 注:此篇只是為測試環境下的快速入門。後續會給大家帶來生產環境下得實戰開發。 具體的大家可以去看官方推薦。非常的簡單明瞭。以下介紹引用官方內容: Apollo(阿波羅)是攜程框架部門研發的分散式配置中心,能夠集中化管理應用不同環境、不同叢集的配置,配置修改後能夠實時推送到應用端,並且具

.net core實踐系列簡訊服務-Sikiro.SMS.Bus服務的實現

前言 本篇會繼續講解Sikiro.SMS.Bus的服務實現,此實現是基於開篇的架構設計的擁有排程任務服務,在最後一篇會給架構優化的,拋棄了排程任務服務使用MQ代替。 原始碼地址:https://github.com/SkyChenSky/Sikiro.SMS 功能流程描述 如上圖所示,消費者訂

.net core實踐系列簡訊服務-Sikiro.SMS.Job服務的實現

前言 本篇會繼續講解Sikiro.SMS.Job服務的實現,在我寫第一篇的時候,我就發現我當時設計的架構裡Sikiro.SMS.Job這個可以選擇不需要,而使用MQ代替。但是為了說明排程任務使用實現也堅持寫了下。後面會一篇針對架構、實現優化的講解。 原始碼地址:https://github.com/Sky

.net core實踐系列簡訊服務-架構優化

前言 通過前面的幾篇文章,講解了一個簡訊服務的架構設計與實現。然而初始方案並非100%完美的,我們仍可以對該架構做一些優化與調整。 同時我也希望通過這篇文章與大家分享一下,我的架構設計理念。 原始碼地址:https://github.com/SkyChenSky/Sikiro.SMS/tree/opti

.NET Core實戰專案CMS 第十章 設計篇-系統開發框架設計

這兩天比較忙,週末也在加班,所以更新的就慢了一點,不過沒關係,今天我們就進行千呼萬喚的系統開發框架的設計。不知道上篇關於架構設計的文章大家有沒有閱讀,如果閱讀後相信一定對架構設計有了更近一部的理解,如果你沒有閱讀也希望大家能好好閱讀一下!其實說白了,架構是為了應對軟體系統複雜度而提出的一個解決方案,架構設計的

.NET Core微服務基於Steeltoe使用Eureka實現服務註冊與發現

一、關於Steeltoe與Spring Cloud    Steeltoe is an open source project that enables .NET developers to implement industry standard best practices when b