zoukankan      html  css  js  c++  java
  • ASP.NET Core源码学习(一)Hosting

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



  • 相关阅读:
    U3D开发中关于脚本方面的限制-有关IOS反射和JIT的支持问题
    APP发行渠道
    在WINDOWS上开发IOS应用的方法
    如何安全的在不同工程间安全地迁移asset数据?三种方法
    UNITY 的GC ALLOC到底是什么
    Dictionary,hashtable, stl:map有什么异同?
    如何成为一个优秀的高级C++程序员
    两点间所有路径的遍历算法
    技术人员的未来:做技术还是做管理?
    技术人员如何去面试?
  • 原文地址:https://www.cnblogs.com/CoderAyu/p/8490107.html
Copyright © 2011-2022 走看看