asp net core 3.1启动过程源码解读

一:与以前的asp.net区别

  •    代码开源了,不需要反编译了,随时随地调试源码
  •     以应用程序方式启动,而不是直接建立一个web网站
  •     asp.net是全家桶的方式,而net core是以自选套餐形式,定义了基础的一些组件后,当你需要用什么类库的时候就得自己去引用或者造轮子(当然,一般都很少机会造)
  •     asp.net配置文件是.config ,而net core是.json(默认加载appsettings.json,也可以自定义指定)
  •     很多地方默认实现了IOC和DI,反正就是无处不在的IOC和DI,使程序编程更加灵活多变

       总的来说:轻量化、灵活多变、开源、跨平台

二:与netcore 2.x版本区别

         具体请看官网: https://docs.microsoft.com/zh-cn/aspnet/core/release-notes/aspnetcore-3.0?view=aspnetcore-3.1#generic-host

         我个人觉得最明显的就2个地方:一个是默认使用的序列化改成 System.Text.Json  另外一个就是通用主机 ,可以让我们自定义服务,用来承载任何服务

三:创建项目后自动生成的代码启动过程源码解读

       先看代码,这是一个web api的项目,默认实现了一些方法

       

  public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args)
.Build()//创建host宿主
.Run();//运行程序 }
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args)//创建IHostBuilderhost对象,读取默认配置 .ConfigureWebHostDefaults(webBuilder =>//注册默认服务 { webBuilder.UseStartup<Startup>(); }) ; }

 

   从上面的代码执行顺序可以看到先创建一个IHostBuilder抽象对象,然后执行读取默认配置方法,然后注册一系列服务,最后创建host宿主,运行程序。

   接下来可以拆分步骤解读源码

      1. 创建IHostBuilderhost宿主,读取默认配置,从源码上我们可以看到 执行顺序,里面我也加了一些注释(Microsoft.Extensions.Hosting.Host类)

        

    2.注册一系列服务(ConfigureWebHostDefaults这个方法),里面主要做了以下这些事(Microsoft.Extensions.Hosting.GenericHostBuilderExtensions类)  

      

 

 

        a.调用WebHost.ConfigureWebDefaults方法,注册web宿主,这里面就是注册一系列默认的服务(Microsoft.AspNetCore.WebHost )

   

                 

 

            b.读取扩展的委托

       

     3.创建host宿主(Microsoft.Extensions.Hosting.HostBuilder)

     

 

 

 

            

  ps:从上面Build方法的源码可以看出来,启动是有顺序的,所以Startup 这个类不是必要的,因为Startup里面就2个方法(ConfigureService和Config),也就是对应上面源码的CreateServiceProvider()方法,它只是让代码结构看起来更加合理

 

 

      

 

posted @ 2020-03-26 17:17  hkf  阅读(930)  评论(0编辑  收藏  举报