.Net core 源码解析

  • 启动代码
  • 创建并配置主机Builder
  • CreateDefaultBuilder分析
    • Host类-用于产生初始的builder静态类
    • IHostBuilder转变成IWebHostBuilder
  • WebHost.ConfigureWebDefualts(IWebHostBuilder)方法
  • webBuilder.UseStartup()方法
  • 总结
    • 引用

启动代码

namespace SmapleWeb
{public class Program{public static void Main(string[] args){CreateHostBuilder(args).Build().Run();}public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>{webBuilder.UseStartup<Startup>();});}
}

将上述代码

CreateHostBuilder(args).Build().Run();

拆分成:

IHostBuilder builder= CreateHostBuilder(args); //产生一个IHostBuilder实例builder
IHost host=builder.Build();//产生一个Ihost实例host
host.Run();//开始运行web项目,这时候就由Console转换成Web项目

创建并配置主机Builder

拆解CreateHostBuilder

 public static IHostBuilder CreateHostBuilder(string[] args) {IHostBuilder builder = Host.CreateDefaultBuilder(args);//创建IHostBuilder实例Action<IWebHostBuilder> configAction = delegate(IWebHostBuilder webBuilder){webBuilder.UseStartup<Startup>();};builder = builder.ConfigureWebHostDefaults(configAction); //将IHostBuilder实例转变为web主机性质的IWebHostBuilderreturn builder;}

CreateDefaultBuilder分析

CreateDefaultBuilder主要用于创建IHostBuilder对象实例,有了这个实例才可以继续后续的加载更多的配置操作。通过IHostBuilder.Build()生产IHost实例。最终通过IHost.Run()运行项目。

Host类-用于产生初始的builder静态类

using Microsoft.Extensions.Hosting;namespace Microsoft.Extensions.Hosting{public static class Host{public static IHostBuilder CreateDefaultBuilder();public static IHostBuilder CreateDefaultBuilder(string[] args);}}

IHostBuilder转变成IWebHostBuilder

建立了IHostBuilder实例后,将通过builder.ConfigureWebHostDefaults(Action )方法将IHostBuilder实例转变为一个web主机性质的webbuilder(IWebHostBuilder)
Configures a IHostBuilder with defaults for hosting a web app.

public static Microsoft.Extensions.Hosting.IHostBuilder ConfigureWebHostDefaults (this Microsoft.Extensions.Hosting.IHostBuilder builder, Action<Microsoft.AspNetCore.Hosting.IWebHostBuilder> configure)
{Action<IWebHostBuilder> webconfigure = delegate(IWebHostBuilder webHostBuilder){WebHost.ConfigureWebDefaults(webHostBuilder); //配置Web默认值configure(webHostBuilder);};return builder.ConfigureWebHost(webconfigure);
}

引用:
https://docs.microsoft.com/en-us/dotnet/api/microsoft.extensions.hosting.generichostbuilderextensions.configurewebhostdefaults?view=aspnetcore-3.0

其实是利用IHostBuilder的另一个扩展方法ConfigureWebHost(Action)(此扩展法方定义在Microsoft.Extensions.Hosting.GenericHostWebHostBuilderExtensions静态类中)。
把IHostBuilder转变为IWebHostBuilder: builder.ConfigureWebHost(webconfigure)


# builder.ConfigureWebHost(webconfigure) Microsoft.Extensions.Hosting.GenericHostWebHostBuilderExtensions(GenericHostWebHostBuilderExtensions.cs)

using System;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Hosting.Internal;namespace Microsoft.Extensions.Hosting
{public static class GenericHostWebHostBuilderExtensions{public static IHostBuilder ConfigureWebHost(this IHostBuilder builder, Action<IWebHostBuilder> configure){//实现在asp.net core 2.1 里IWebHostBuilder 在asp.net core 3.1里把泛型IHostBuilder生产webhost的builder的var webhostBuilder = new GenericWebHostBuilder(builder);configure(webhostBuilder);return builder;}}
}

通过Microsoft.AspNetCore.Hosting.Internal.GenericWebHostBuilder类实例。GenericWebHostBuilder是一个内部类。这个类网上资源极少,甚至在官方文档里找不到说明,但可以参考其源码GenericWebHostBuilder.cs源代码。此类声明和其构造函数声明如下:

internal class GenericWebHostBuilder : IWebHostBuilder, ISupportsStartup, ISupportsUseDefaultServiceProvider
{public GenericWebHostBuilder(IHostBuilder builder);
}

在传入了那么多层委托后,终于我们扒到底了,在实现了IHostBuilder转变为IWebHostBuilder后,所有config有关的委托终于得以执行,config具体包含的方法为
WebHost.ConfigureWebDefaults(webHostBuilder); //配置Web默认值
webBuilder.UseStartup();

WebHost.ConfigureWebDefualts(IWebHostBuilder)方法

此方法在Asp.net core 2.1中 是WebHost.CreateDefaultBuilder(args) 里最后调用的方法,而在Asp.net core 3.1中,把IWebHostBuilder该为泛型IHostBuilder后,在执行IHostBuilder.ConfigureWebHost()时回调委托执行。此方法作用类似与Host.CreateDefaultBuilder(args),使用预配置配置一些关于Web方式的参数。主要是注入一些web相关的服务,配置主机地址等。此方法没有官方文档说明,建议直接查看源码WebHost.cs源代码(参考文档5)。

webBuilder.UseStartup()方法

UseStartup()是webbuilder的扩展发放,定义在Microsoft.AspNetCore.Hosting.WebHostBuilderExtensions静态类中(WebHostBuilderExtensions.cs),此方法申明如下

public static IWebHostBuilder UseStartup(this IWebHostBuilder hostBuilder, Type startupType)

从方法名就可以看出是使用Startup类,这个方法主要使用反射技术,反射Startup类,响应startup类中的配置的信息

总结

1.IHostBuilder builder = Host.CreateDefaultBuilder(args);
创建一个基础builder(读取app.json)
2.IWebHostBuilder webHostBuilder= new GenericWebHostBuilder(builder);
转换为webbuilder
3.WebHost.ConfigureWebDefaults(webHostBuilder);
给webbuilder使用预先的默认值配置
4.webBuilder.UseStartup<Startup>();
读取startup类配置信息

引用

asp.net core 3.1 入口:Program.cs中的Main函数
深入ASP.NET Core源代码之 - HOST

.Net Core 源码解析相关推荐

  1. .net core 源码解析-mvc route的注册,激活,调用流程(三)

    .net core mvc route的注册,激活,调用流程 mvc的入口是route,当前请求的url匹配到合适的route之后,mvc根据route所指定的controller和action激活c ...

  2. .net core 源码解析-web app是如何启动并接收处理请求

    最近.net core 1.1也发布了,蹒跚学步的小孩又长高了一些,园子里大家也都非常积极的在学习,闲来无事,扒拔源码,涨涨见识. 先来见识一下web站点是如何启动的,如何接受请求,.net core ...

  3. .net core 源码解析-web app是如何启动并接收处理请求(二) kestrel的启动

    上篇讲到.net core web app是如何启动并接受请求的,下面接着探索kestrel server是如何完成此任务的. 1.kestrel server的入口KestrelServer.Sta ...

  4. abp vnext2.0核心组件之.Net Core默认DI组件切换到AutoFac源码解析

    老版Abp对Castle的严重依赖在vnext中已经得到了解决,vnext中DI容器可以任意更换,为了实现这个功能,底层架构相较于老版abp,可以说是进行了高度重构.当然这得益于.Net Core的D ...

  5. .Net Core 认证系统之基于Identity Server4 Token的JwtToken认证源码解析

    介绍JwtToken认证之前,必须要掌握.Net Core认证系统的核心原理,如果你还不了解,请参考.Net Core 认证组件源码解析,且必须对jwt有基本的了解,如果不知道,请百度.最重要的是你还 ...

  6. .Net Core 认证组件源码解析

    不知不觉.Net Core已经推出到3.1了,大多数以.Net为技术栈的公司也开始逐步的切换到了Core,从业也快3年多了,一直坚持着.不管环境怎么变,坚持自己的当初的选择,坚持信仰 .Net Cor ...

  7. .NET Core实战项目之CMS 第三章 入门篇-源码解析配置文件及依赖注入

    写在前面 上篇文章我给大家讲解了ASP.NET Core的概念及为什么使用它,接着带着你一步一步的配置了.NET Core的开发环境并创建了一个ASP.NET Core的mvc项目,同时又通过一个实战 ...

  8. .net core linux 编译,.NET Core 源码编译的问题解析

    引言: .NET Core 源码编译 https://github.com/dotnet git clone https://github.com/dotnet/runtime.git 一:Windo ...

  9. .Net Core 中间件之主机地址过滤(HostFiltering)源码解析

    一.介绍 主机地址过滤中间件相当于一个白名单,标记哪些主机地址能访问接口. 二.使用 新建WebAPI项目,修改Startup中的代码段如下所示.下面表示允许主机名为"localhost&q ...

最新文章

  1. javascript中while循环、do....while与for循环的用法和区别
  2. JDK、J2EE、J2SE、J2ME的区别
  3. Java基础01 从HelloWorld到面向对象
  4. C++学习笔记-----std::pair作为unordered_map的key
  5. vue-cli3+与vue-cli2的区别和vue-cli 修改配置
  6. 济南昊锐科技谈程序员与用户UI
  7. Git前世今生-版本控制软件的发展
  8. thikPHP框架部署
  9. USTB自习教室查询系统-项目计划书-第二部分
  10. Spark sql优化
  11. 如何查看当前所用浏览器版本是否支持Vue3+ElementUIPlus
  12. 药物组合疗法的机器学习方法(综述类)
  13. 在vue项目中使用supermap,基于 SuperMap iClient 8C(2017) for JavaScript,底图为天地图
  14. 实现Office文档的在线查看等功能
  15. 背景图片与图片对盒子的影响
  16. JAVA 性能调优相关命令
  17. 微软修复打印机服务漏洞 所有支持Windows系统都受影响
  18. 【研究生】计算机架构的新黄金时代,两位图灵奖得主最新力作
  19. java跳格子不同跳发_(算法)跳格子
  20. Makefile 读书笔记

热门文章

  1. 微型计算机shr,shl指令(shr是什么指令)
  2. 树莓派镜像烧录教程(史上最全,最完整的树莓派学习专栏)
  3. 一起来看流星雨剧情简介/剧情介绍/剧情分集介绍第二十集
  4. Excel如何快速给自家的男宝宝起名字
  5. 二维码生成:STM32F407 + LCD屏(GUI)制作二维码
  6. 外媒关注:中国版Twitter新浪微博推出微米对抗微信
  7. 财富:保罗·艾伦转向新领域
  8. 让bootstrap兼容ie6 ie7 ie8 ie9 ie10 ie11的解决方法
  9. 计算机与通信网络之间的常用通信设备,通讯设备有哪些,通信常用设备总结
  10. flink批处理读取文件入库mysql