前言
通用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除外