net core 的Generic Host 之Generic Host Builder

BruceTian(曉青)發表於2019-05-29

前言

通用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。

avatar

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 的Generic Host 之Generic Host Builder

相關文章