天津列车时刻表,异能特种兵,甜心求求你爱我
只是讲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只是由通用主机承载的其中一种服务。
上面提了几次“应用”,现在对于主机来说asp.net core框架就是一个应用、我们上面举例说的"物联网后端服务"是另一个应用。从代码上来说就是一个ihostedservice的实现。
主机和应用是一对多的关系,多个应用可以共享主机的信息,如:主机的ioc容器、主机的配置。应用配置。应用当然也可以自己去创建自己的ioc根容器和配置对象
主机配置和应用配置有关系?这两个配置对象都存在于host中,主机配置是只跟主机相关的配置,应用配置是主机中多个应用共享的配置,如果主机中只有一个应用,那么完全可以拿它做最终的应用配置。另外应用配置包含主机配置
注意:在理解时要记住我们现在的目的是讲解通用主机,意思是可以承载你自己定义的服务的主机,别去想什么mvc controller action 路由之类的
下面分别介绍下主机中的几个核心默认实现类,几乎每个类都有对应的接口,为了缩短篇幅、便于理解就不讲接口了。
它代表主机,用来宿主(承载)我们应用(一个ihostedservice的实现)。
主要包含:日志、主机和应用的生命周期事件、ioc根容器、主机的选项对象、启动停止/停止方法。
接口中只定义了:ioc根容器 + start + stop方法
它在program.main中被创建、配置和启动
默认实现microsoft.extensions.hosting.internal.host,它是一个internal的类,这个主机将来被启动时:
扩展:
因为默认host是internal修饰的,所以无法继承
大部分情况下方式2实现起来更容易也更常见
提一嘴,asp.net core 3.x现在也是使用的这个默认主机,只是在上面做了根web相关的配置,将在下一篇讲解
host的职责只是完成主机该有的功能,那么它的创建及配置最好另外定义一个类hostbuilder,它是host的创建器(工厂),我们通常
通过接口ihostbuilder源码可以初略看出它(通过委托的方式)提供以下功能
扩展:
对于我们使用者来说主要是通过它的方法向内部塞入各种委托,以达到向ioc容器注册服务和设置主机和应用的“配置源”
也可以但估计很少去实现主机的ihostbuilder;继承hostbuilder意义也不大,因为它没有提供抽象和虚方法
默认build流程
初始化主机配置对象iconfiguration,主要是回调,主机没有做其它的
初始化主机环境对象_hostingenvironment
初始化hostbuildercontext,根据上面的配置和环境创建这个上下文(这里只是暂时用的主机配置,下面会被替换成应用的配置)
初始化应用配置
创建ioc容器
调用容器解析并返回host
上面有了host,也有了对应的创建器hostbuilder,为啥还要再提供一个工厂方法呢?
因为职责分离原则,host只负责承载应用并提供容器和设置配置源;hostbuilder只是负责配置并创建host,尽可能提供一些默认值(前提时将来调用方未提供那些参数)。此时我们可以直接用hostbuilder来创建host并启动它,但别忘了.net core是一个通用框架,它应提供一个更简洁的方式来创建最终的host,因此它提供了静态方法host.createdefaultbuilder,它尽可能提供更多的默认值,核心任务如下:
通过自定义实现ihostedservice的类来实现我们的服务,我们的服务中的类可以
在program.man调用host.createdefaultbuilder,如果需要,提供相应的委托来注册服务和设置主机和应用的“配置源”,最好是通过相关扩展方法和自定义扩展方法。重点是记得注入我们自己的服务实现类
.net core为我们提供了新的承载应用(包括但不仅限于asp.net core)的方式-->通用主机,通过它我们可以很容易的在自己的应用中使用依赖注入、配置、日志等,你可以发挥想象实现很多牛b的框架。
asp.net core 3.x开始默认也是使用它来承载的
核心的host、hostbuilder、host.createdefaultbuilder实现了通用主机,并提供了扩展点
最后我想说如果在.net core上提供一个默认的aop方案就更完美了。
下一篇试试说下asp.net core是如何承载到通用主机上的
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Net Core Web Api项目与在NginX下发布的方法
asp.net core3.1 引用的元包dll版本兼容性问题解决方案
IdentityServer4实现.Net Core API接口权限认证(快速入门)
ASP.NET Core MVC通过IViewLocationExpander扩展视图搜索路径的实现
网友评论