只是讲asp.net core 3.x通用主机的大致原理,这些东西是通过查看源码以及自己根据经验总结得来的,在文章中不会深入源码,因为个人觉得懂原理就晓得扩展点,后期碰到有需求的时候再仔细去研究源码也不迟。
阅读前你应该先去了解下(推荐博客园老A的博客):
配置,
讲解的方式是:
概述
逐一介绍核心类及扩展方式
通常我们如何使用
总结
二、概述
以前的控制台应用程序、winform程序启动时main首先被执行,后续都是我们自己的代码来实现框架和业务上的东东,比如我们要使用配置就ConfigurationManager.AppSettings... 若想使用依赖注入则需要引入第三方框架,比如autofact。asp.net framework时代也类似
在.net core 3.0之前的版本默认使用的是IWebHost,它内部定义了IOC容器(服务注册体现在Startup.ConfigServices),和各种配置源的设置(体现在Program配置主机时),我们后续的Controler、View、包括业务代码可以很容易做依赖注入和获取配置信息(包括运用选项模式)
有时候我们希望写一个服务,但是这个服务并不是用来做api/web,处理http请求的,比如想做一个物联网的后端采集服务,一直等待远端硬件设备提交实时数据过来,后端进行处理。但是又希望使用asp.net core提供的 配置、依赖注入、日志 和其它功能。后来微软就将asp.net core中的这套东西抽离出来了,叫做通用主机,用来承载任何服务,这些自定义服务中就可以很方便地使用配置、依赖注入、日志、和其它功能。现在asp.net core只是由通用主机承载的其中一种服务。
2.1、默认情况下主要的实现思路是: 2.1.1、定义(微软定义好的):定义HOST,它包含IOC根容器、主机和应用程序的生命周期事件定定义、IHostedService集合(一个实例就是一个服务或者叫应用,asp.net core就是一个这样的实例)
允许调用方提供一堆委托来向IOC中注册服务、和设置主机和应用的“配置源”
提供向主机添加IHostedService的实现对象的方法
允许调用方注册主机和应用在启动和停止阶段触发的相应事件
2.1.2、配置(我们的代码,微软定义很多辅助方法):创建IHost实例
向Host的IOC容器中注册各种服务
配置主机和应用程序的“配置源
向主机内部添加IHostedService实例(也就是我们最终的服务)
主机和应用的生命周期事件,来实现一些特殊任务
2.1.3、启动阶段(微软定义好的)上面所谓的配置基本都是通过委托实现的(通常微软提供的各种扩展方法最终也是执行委托),回调这些委托以设置“配置源”和注册服务
最后遍历启动HostedService
在启动过程中还会回调相应的生命周期事件
2.2、啥是应用?上面提了几次“应用”,现在对于主机来说asp.net core框架就是一个应用、我们上面举例说的"物联网后端服务"是另一个应用。从代码上来说就是一个IHostedService的实现。
主机和应用是一对多的关系,多个应用可以共享主机的信息,如:主机的IOC容器、主机的配置。应用配置。应用当然也可以自己去创建自己的IOC根容器和配置对象
主机配置和应用配置有关系?这两个配置对象都存在于Host中,主机配置是只跟主机相关的配置,应用配置是主机中多个应用共享的配置,如果主机中只有一个应用,那么完全可以拿它做最终的应用配置。另外应用配置包含主机配置
注意:在理解时要记住我们现在的目的是讲解通用主机,意思是可以承载你自己定义的服务的主机,别去想什么mvc controller action 路由之类的
三、核心类下面分别介绍下主机中的几个核心默认实现类,几乎每个类都有对应的接口,为了缩短篇幅、便于理解就不讲接口了。
3.1、Host它代表主机,用来宿主(承载)我们应用(一个IHostedService的实现)。
主要包含:日志、主机和应用的生命周期事件、IOC根容器、主机的选项对象、启动停止/停止方法。
接口中只定义了:IOC根容器 + Start + Stop方法
它在Program.Main中被创建、配置和启动
默认实现Microsoft.Extensions.Hosting.Internal.Host,它是一个internal的类,这个主机将来被启动时:
触发主机的WaitForStartAsync事件
逐一启动主机累不的hostedService
触发_applicationLifetime?.NotifyStarted();事件
停止时就反过来,先逐一停止hostedService,触发响应事件、最后停止主机
扩展:
因为默认Host是internal修饰的,所以无法继承
自定义实现IHost;(这不说了,你可以随心所欲)
订阅主机和应用的生命周期事件(实现IHostLifetime、IHostApplicationLifetime并添加到IOC容器)
大部分情况下方式2实现起来更容易也更常见
提一嘴,asp.net core 3.x现在也是使用的这个默认主机,只是在上面做了根web相关的配置,将在下一篇讲解
3.2、HostBuilderHost的职责只是完成主机该有的功能,那么它的创建及配置最好另外定义一个类HostBuilder,它是Host的创建器(工厂),我们通常
在系统启动时(Program.Man)先创建HostBuilder,
然后进行配置(向IOC容器注册服务,设置主机和应用的"配置源"),
最后调用Build方法生成我们最终的Host
通过接口IHostBuilder源码可以初略看出它(通过委托的方式)提供以下功能
设置主机和应用的“配置源”
配置IOC容器本身
想IOC容器添加服务
根据以后配置创建Host
有个Properties属性,是个字典类型,可以在构建Host的多个步骤中传递数据
扩展: