Asp.net Core 2.1新功能Generic Host(通用主机)深度学习

什么是Generic Host ?

Asp.net Core 2.1新功能Generic Host(通用主机)深度学习

 

这是在Asp.Net Core 2.1加入了一种新的Host,现在2.1版本的Asp.Net Core中,有了两种可用的Host。

  • Web Host –适用于托管Web程序的Host,就是我们所熟悉的在Asp.Net Core应用程序的Mai函数中用CreateWebHostBuilder创建出来的常用的WebHost。

Asp.net Core 2.1新功能Generic Host(通用主机)深度学习

  • Generic Host (ASP.NET Core 2.1版本才有) – 适用于托管非 Web 应用(例如,运行后台任务的应用)。 在未来的版本中,通用主机将适用于托管任何类型的应用,包括 Web 应用。 通用主机最终将取代 Web 主机,这大概也是这种类型的主机叫做通用主机的原因,在本博客中,我们将结合源码,讨论通用主机的工作原理。

为什么要用通用主机?

通用主机,让我可以用编写Asp.Net Core的思想(例如控制反转、依赖注入、IOC容器)来简化控制台应用程序的创建(个人见解),主机负责程序的启动和生存周期的管理,这对于不处理HTTP请求的应用程序非常有用(处理HTTP请求的是Web应用程序,用Web Host托管),通用主机的目标是将HTTP管道从Web Host中脱离出来,使得Asp.Net Core的那套东西也适用于其他.Net Core程序。

Demo下载

在开始跟随我分析通用主机之前,大家可以到Github下载这个官方Demo。

https://github.com/aspnet/Docs/tree/master/aspnetcore/fundamentals/host/generic-host/samples/

如果觉得下载一整个比较慢,可以从我的这个Github仓库下载,没有其他多余内容,国内Github比较慢,如果你从官方那个仓库下载可能会需要很长时间甚至失败。

https://github.com/liuzhenyulive/Generic-Host-Demo 

Generic Host 和Web Host 对比

首先,大家打开下载下来的这个官方Demo,进入Main函数。

Asp.net Core 2.1新功能Generic Host(通用主机)深度学习

可以看到,这简直就是一个精简版的Asp.Net Core应用程序,对这个Main函数中出现的所有方法,大家对Asp.Net Core Web应用程序比较熟悉,所以我与Asp.net core 的Webhost做了一个对比,来帮助大家找找感觉。

通用主机 Web主机
new HostBuilder() WebHost.CreateDefaultBuilder(args)
ConfigureAppConfiguration
(用于配置Configuration)
WebHost也有这个方法,只是大家默认可能没有调用。
Asp.net Core 2.1新功能Generic Host(通用主机)深度学习
ConfigureServices
(用于配置Service,也就是依赖注入)
WebHost其实也有ConfigureServices方法,可以这么调用。
Asp.net Core 2.1新功能Generic Host(通用主机)深度学习
但是我们一般很少这么用,一般都是放在Startup的ConfigureServices方法中进行依赖注入。
ConfigureLogging
(是本应用程序所需要的配置,非必需)
WebHost还是有!
Asp.net Core 2.1新功能Generic Host(通用主机)深度学习
builder.RunConsoleAsync()
Asp.net Core 2.1新功能Generic Host(通用主机)深度学习
RunConsoleAsync中其实是对hostbuilder进行
Builder然后Run
CreateWebHostBuilder(args).Build().Run();

也就是Main函数中的Build().Run();

无无无无
Startup中的Configure()方法
Asp.net core在此方法中进行Http请求管道的配置

 

综上对比,我做了如下概括!

  1. 通用主机(Generic Host)有的 Web Host都有。

  2. Web Host的Http Pipeline即Startup.Configure() 在通用主机中没有。

这就应证了开头所说的:通用主机的目标是将HTTP管道从Web Host中脱离出来,使得Asp.Net Core的那套东西也适用于其他.Net Core程序。

如何使用?

Run函数解读

我觉得要知道怎么用,那么我们就首先要知道Host的Run方法内到底是在执行什么?

所以我们深入源码,一路F12!

builder.RunConsoleAsync(); =>hostBuilder.UseConsoleLifetime().Build().RunAsync(cancellationToken);=> await host.StartAsync(token);

总算找到了,最关键的在这里。

Asp.net Core 2.1新功能Generic Host(通用主机)深度学习

知道大家都喜欢Yellow色,所以我用Yellow把最关键的代码标示出来了,那么这些代码有什么含义呢?

this._hostedServices = this.Services.GetService<IEnumerable<IHostedService>>();

这一行的意思是,从容器中取出所有实现了IHostedService的服务。

这就意味着,我们实现了IHostedService后,需要把该Service注册到IOC容器中。

foreach (IHostedService hostedService in this._hostedServices)
      await hostedService.StartAsync(cancellationToken).ConfigureAwait(false);

执行每个服务的StartAsync方法。

所以,大家是不是冥冥中猜到了怎么用的呢?Asp.net Core 2.1新功能Generic Host(通用主机)深度学习

我总结的步骤如下:

  1. 自定义一个Service,继承 IHostedService接口。

  2. 实现 IHostedService的StartAsync方法,把需要执行的任务放到这个方法中。

  3. 把该服务注册到IOC容器(ServiceCollection)中。

自定义任务的运行

对于步骤1和2,对应的代码如下:

Asp.net Core 2.1新功能Generic Host(通用主机)深度学习

可以看到,在StartAsync中,定义了一个定时任务,带定时任务每五秒执行一次DoWork方法。

在DoWork方法中,日志记录器记录了一段内容。

因为在Main方法中,对Log进行了如下的配置。

Asp.net Core 2.1新功能Generic Host(通用主机)深度学习

所以,一旦日志记录了内容,该内容就会在控制台中输出。

对于步骤3,对应的代码如下

Asp.net Core 2.1新功能Generic Host(通用主机)深度学习

黄色部分,把实现了IHostedService接口的PrintTextToConsoleService注册到容器中。 

F5 运行

Asp.net Core 2.1新功能Generic Host(通用主机)深度学习

可以看到,控制台中,每五秒就有一次内容输出,说明DoWork方法没五秒被执行了一次,也说明PrintTextToConsoleService的StartAsync被成功调用了。 

希望本文对帮助大家理解通用主机能够有所帮助,如果对.Net Core的源码分析、潮流新技术感兴趣

欢迎关注我

不定期推出实用干活,谢谢!

参考文献

https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/host/generic-host?view=aspnetcore-2.1

原文链接:https://www.cnblogs.com/CoderAyu/p/9564977.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

Asp.net Core 2.1新功能Generic Host(通用主机)深度学习