一、什么是Host
Host作为一个可以用来托管web程序的服务对象,用于封装应用资源以及应用程序启动和生存期管理,其主要功能包括配置初始化、创建托管环境和Host通用上下文、依赖注入等。封装的应用资源有:
- 依赖注入框架DI
- Logging日志
- Cofiguration配置
- 托管服务:IHostedService服务接口的实现
二、Host是如何构建的
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
从上述代码可以看到,Main函数中首先调用CreateHostBuilder方法,返回一个IHostBuilder。任何调用IHostBuilder.Build()方法完成。
2.1 通过Host.CreateDefaultBuilder(args):构造IHostBuilder的默认实现HostBuilder
从上述.NET Core源代码中,可以看到CreateDefaultBuilder内部构造了一个HostBuilder,同时设置了:
-
将内容根目录(contentRootPath)设置为由 GetCurrentDirectory 返回的路径。
-
通过以下源加载主机配置
- 环境变量(DOTNET_前缀)配置
- 命令行参数配置
-
通过以下对象加载应用配置
- appsettings.json
- appsettings.{Environment}.json
- 密钥管理器 当应用在 Development 环境中运行时
- 环境变量
- 命令行参数
-
添加日志记录提供程序
- 控制台
- 调试
- EventSource
- EventLog( Windows环境下)
-
当环境为“开发”时,启用范围验证和依赖关系验证。