前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ASP.NET Core源码学习(一)Hosting

ASP.NET Core源码学习(一)Hosting

作者头像
码农阿宇
发布2018-04-18 15:41:19
4.7K0
发布2018-04-18 15:41:19
举报
文章被收录于专栏:码农阿宇码农阿宇

ASP.NET Core源码的学习,我们从Hosting开始,

Hosting的GitHub地址为:https://github.com/aspnet/Hosting.git

朋友们可以从以上链接克隆或是下载。

为什么是从Hosting开始学习呢?我们来看看ASP.NET Core MVC项目中的Pragram.CS中的Main()方法.

我们可以看到,MVC的项目首先是从IWebHostBuilder开始的,webhostbuilder执行Build方法后,就能构建出WebHost实例,而WebHost实例就是一个一直运行监听http请求的Task。所以,下面,我们从WebHostBuilder的Build讲起。

WebBuilder位于SRC->Mircosoft.AspNetCore.Hosting下。我们来看看它的Build方法。

在抛弃前面一堆代码后,我们看到,首先是通过BuildCommonServices来构建一个ServiceCollection。那么我们来看看BuildCommonService在构建ServiceCollection的过程中欧个,都在做些什么。我们先跳转到BuidCommonServices方法。

我首先注意到,构建的是一个ServiceCollection然后往services实例里面注入了一些东西,这些东西包括MiddlewareFactory中间件工厂,HttpContextFactory等,在这里对系统一些必要的依赖进行了注入。

在这些依赖注入中,有一个非常重要的依赖注入是StartUp的依赖注入,首先,判断Startup类是否继承于IStartup接口,如果是继承的,那么就可以直接加入在Services里面去,如果不是继承的话,就需要通过ConventionBasedStartup(methods)把method转换成IStartUp后加入到Services里面去。

事实上,我留意到,我们平时建立的startup类都是没有继承于Istartup接口的。

所以,它应该是被Convent转换成IStartUp后,再依赖注入到services中去的。

然后,在BuildCommonServices最后,service被返回了。

我们回到Build方法。

拿到了hostingServices也就是BuildCommonServices中返回的service也就是ServiceCollection实例后,通过ServieCollection的BuildSerceProvider方法构造出了ServiceProvider实例。到目前为止,ServiceCollection和ServiceProvider都拿到了。

然后,利用拿到的ServceiCollection和ServiceProvider构造出WebHost实例。构造了WebHost实例还不能直接返回,通过Initialize对WebHost实例进行初始化。那我们看看在初始化函数Initialize中,都做了什么事情。

在构造函数中看不出什么,主要的动作被引导到了BuildApplication函数中

在BuidApplication函数中,主要是EnsureApplicationServices和EnsureService()

EnsureApplicarionServcie函数中,主要是先通过EnsureStartUp拿到Startup对象,拿到startUp对象后,通过_startup.ConfigureServices拿到ServiceProvider。

到此为止,startUp和ServiceProvider都有了。

差不多就可以运行WebHost了,我们看看在WebHost的Run方法中都做了什么事情。

Webhost的Run方法在WebHostExtensions.cs类中,该类同样位于Microsoft.AspNetCore.Hosting下。

首先,WebHost执行RunAsync运行web应用程序并返回一个只有在触发或关闭令牌时才完成的任务。

这就是我们运行ASP.Net Core程序的时候,看到的那个命令行窗口了,如果部关闭窗口或者Ctrl+C的话是无法结束的。

到此为止,同WebHost的Build到Run中的重点差不多就分析结束了。我简要画了一个流程图,希望能帮助大家理解整过过程。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-02-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档