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

简介: ASP.NET Core源码的学习,我们从Hosting开始, Hosting的GitHub地址为:https://github.com/aspnet/Hosting.git 朋友们可以从以上链接克隆或是下载。

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



 

相关文章
|
1月前
|
消息中间件 前端开发 小程序
一个基于.NET Core构建的简单、跨平台、模块化的商城系统
今天大姚给大家分享一个基于.NET Core构建的简单、跨平台、模块化、完全开源免费(MIT License)的商城系统:Module Shop。
|
1月前
|
算法 C# 数据库
【干货】一份10万字免费的C#/.NET/.NET Core面试宝典
C#/.NET/.NET Core相关技术常见面试题汇总,不仅仅为了面试而学习,更多的是查漏补缺、扩充知识面和大家共同学习进步。该知识库主要由自己平时学习实践总结、网上优秀文章资料收集(这一部分会标注来源)和社区小伙伴提供三部分组成。该份基础面试宝典完全免费,发布两年来收获了广大.NET小伙伴的好评,我会持续更新和改进,欢迎关注我的公众号【追逐时光者】第一时间获取最新更新的面试题内容。
|
1月前
|
数据可视化 网络协议 C#
C#/.NET/.NET Core优秀项目和框架2024年3月简报
公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的介绍、功能特点、使用方式以及部分功能截图等(打不开或者打开GitHub很慢的同学可以优先查看公众号推文,文末一定会附带项目和框架源码地址)。注意:排名不分先后,都是十分优秀的开源项目和框架,每周定期更新分享(欢迎关注公众号:追逐时光者,第一时间获取每周精选分享资讯🔔)。
|
1月前
|
开发框架 .NET BI
ASP.NET公立医院健康体检信息管理系统源码
健康体检信息管理系统是专门针对医院体检中心的日常业务运作的特点和流程,结合数字化医院建设要求进行设计研发的一套应用系统。该系统覆盖体检中心的所有业务,完成从预约、登记、收费、检查、检验、出报告、分析、报表等所有工作,规范了体检流程,提高了工作效率。体检系统为每个体检者建立一套完整的体检档案,与病人的门诊、住院诊疗信息有机集成, 真正体现数字化医院以病人为中心的建设原则。
27 1
|
1月前
|
开发框架 安全 .NET
ASP.NET三甲医院手术麻醉信息管理系统源码 对接麻醉机、监护仪、血气分析仪
辅助医院建设 •支持三级医院评级需求 •支持智慧医院评级需求 •支持互联互通评级需求 •支持电子病历评级需求
23 0
|
18天前
|
开发框架 前端开发 JavaScript
JavaScript云LIS系统源码ASP.NET CORE 3.1 MVC + SQLserver + Redis医院实验室信息系统源码 医院云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件,云LIS系统围绕临床,云LIS系统将与云HIS系统建立起高度的业务整合,以体现“以病人为中心”的设计理念,优化就诊流程,方便患者就医。
22 0
|
1月前
|
Linux API iOS开发
.net core 优势
.NET Core 的优势:跨平台兼容(Windows, macOS, Linux)及容器支持,高性能,支持并行版本控制,丰富的新增API,以及开源。
27 4
|
1月前
|
开发框架 人工智能 .NET
C#/.NET/.NET Core拾遗补漏合集(持续更新)
在这个快速发展的技术世界中,时常会有一些重要的知识点、信息或细节被忽略或遗漏。《C#/.NET/.NET Core拾遗补漏》专栏我们将探讨一些可能被忽略或遗漏的重要知识点、信息或细节,以帮助大家更全面地了解这些技术栈的特性和发展方向。
|
2月前
|
开发框架 搜索推荐 .NET
ASP.NET体检中心源码,实现检前、检中、检后全流程管理
健康体检系统遵循整个健康体检的实际流程,以提高工作效率、降低错检、防止漏检提高人性化服务水平为目的,在体检过程中可以高效、自动化、人性化的处理数据与提供服务。针对体检流程中工作强度在时间分配上不均匀等特点,解决了体检信息处理效率问题,在不增加体检中心人力资源投入或少投入的基础上,提升信息处理的效率,从而突破体检中心日处理体检人数的上限,为体检中心创造更大经济效益的同时,还能有效的降低体检工作者的劳动强度。
38 5
|
2月前
|
开发框架 中间件 .NET
C# .NET面试系列七:ASP.NET Core
## 第一部分:ASP.NET Core #### 1. 如何在 controller 中注入 service? 在.NET中,在ASP.NET Core应用程序中的Controller中注入服务通常使用<u>依赖注入(Dependency Injection)</u>来实现。以下是一些步骤,说明如何在Controller中注入服务: 1、创建服务 首先,确保你已经在应用程序中注册了服务。这通常在Startup.cs文件的ConfigureServices方法中完成。例如: ```c# services.AddScoped<IMyService, MyService>(); //
84 0