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中的重点差不多就分析结束了。我简要画了一个流程图,希望能帮助大家理解整过过程。

ASP.NET Core源码学习(一)Hosting的更多相关文章

  1. ASP.NET Core 源码学习之 Logging[1]:Introduction

    在ASP.NET 4.X中,我们通常使用 log4net, NLog 等来记录日志,但是当我们引用的一些第三方类库使用不同的日志框架时,就比较混乱了.而在 ASP.Net Core 中内置了日志系统, ...

  2. 【ASP.NET Core 】ASP.NET Core 源码学习之 Logging[1]:Introduction

    在ASP.NET 4.X中,我们通常使用 log4net, NLog 等来记录日志,但是当我们引用的一些第三方类库使用不同的日志框架时,就比较混乱了.而在 ASP.Net Core 中内置了日志系统, ...

  3. ASP.NET Core 源码学习之 Options[1]:Configure

    配置的本质就是字符串的键值对,但是对于面向对象语言来说,能使用强类型的配置是何等的爽哉! 目录 ASP.NET Core 配置系统 强类型的 Options Configure 方法 源码解析 ASP ...

  4. ASP.NET Core 源码学习之 Options[4]:IOptionsMonitor

    前面我们讲到 IOptions 和 IOptionsSnapshot,他们两个最大的区别便是前者注册的是单例模式,后者注册的是 Scope 模式.而 IOptionsMonitor 则要求配置源必须是 ...

  5. ASP.NET Core 源码学习之 Logging[2]:Configure

    在上一章中,我们对 ASP.NET Logging 系统做了一个整体的介绍,而在本章中则开始从最基本的配置开始,逐步深入到源码当中去. 默认配置 在 ASP.NET Core 2.0 中,对默认配置做 ...

  6. ASP.NET Core 源码学习之 Logging[3]:Logger

    上一章,我们介绍了日志的配置,在熟悉了配置之后,自然是要了解一下在应用程序中如何使用,而本章则从最基本的使用开始,逐步去了解去源码. LoggerFactory 我们可以在构造函数中注入 ILogge ...

  7. ASP.NET Core 源码学习之 Options[2]:IOptions

    在上一篇中,介绍了一下Options的注册,而使用时只需要注入IOption即可: public ValuesController(IOptions<MyOptions> options) ...

  8. ASP.NET Core 源码学习之 Logging[4]:FileProvider

    前面几章介绍了 ASP.NET Core Logging 系统的配置和使用,而对于 Provider ,微软也提供了 Console, Debug, EventSource, TraceSource ...

  9. ASP.NET Core 源码学习之 Options[3]:IOptionsSnapshot

    在 上一章 中,介绍了 IOptions 的使用, 而我们知道,在ConfigurationBuilder的AddJsonFile中,有一个reloadOnChange参数,设置为true时,在配置文 ...

随机推荐

  1. 为什么webstrom无法格式化代码?

    用过webstrom的童鞋都知道格式化代码需要按快捷键:ctrl+Alt+L:可是我最近发现这个快捷键不管用,今天终于知道了原因, 是后台网易云音乐没有关,和网易云音乐的快捷键冲突了,就是这么神奇没办 ...

  2. http协议重点

    https://www.cnblogs.com/ranyonsue/p/5984001.html HTTP简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议) ...

  3. 小甲鱼OD学习第2讲

    这次我们的任务是让我们输入任意用户名密码判断正确 我们输入fishc和111111,显示错误 我们猜测这是用GetDlgItemTextW来收集账号密码的输入值 我们找到了两个函数,给这两个函数都下断 ...

  4. Linux用于嵌入式

    步骤1:Linux工具和项目布局 每个嵌入式软件设计都从选择合适的工具开始. 工具链是一组连接(或链接)在一起的软件开发工具,它包含诸如GNU编译器集合(GCC).binutils(一组包括连接器.汇 ...

  5. docker设置固定ip地址

    Docker安装后,默认会创建下面三种网络类型 $ docker network ls NETWORK ID NAME DRIVER SCOPE 9781b1f585ae bridge bridge ...

  6. 05-Git

    [Git]   [安装git] $ yum install git  #安装git $ ssh-keygen  #遇到输入符直接回车 $ cat ~/.ssh/id_rsa.pub #将这里的信息添加 ...

  7. mysql中的范式与范式——读<<高性能mysql>>笔记一

    对于任何给定的数据库通常都有很多表示方法,从完全的范式化到完全的反范式化,以及两者的折中.在范式化的数据库中,每个事实数据会出现并且只出现一次.相反,在反范式化的数据库中,可能会存储在多个地方. 那什 ...

  8. Java经典编程题50道之六

    输入两个正整数m和n,求其最大公约数和最小公倍数. public class Example06 {    public static void main(String[] args) {       ...

  9. ListIterator的使用

    package cn.lonecloud.Iterator; import java.util.ArrayList; import java.util.ListIterator; public cla ...

  10. “No module named context_processors”

    之前因为django国际化的问题在settings.py里面改了很多东西,国际化是好使了,但是今天要用站点管理admin的时候出!错!了! 我前天用的时候还好好的啊,我的models.py和admin ...