ASP.NET Core 3框架揭秘 10
IHostBuilder IHost IHostService IHostApplicationLifetime
服务器+管道
IServer+Applicationuilder
IServer+IHttpApplication<Context>
WebApplication ==> createbuilder创建了一个新的new WebApplicationBuilder。
WebApplicationBuilder里的初始话方法中:
首先会创建一个HostApplicationBuilder对象,HostApplicationBuilder主要用于表示一个Host Application和Service builder用来管理configuration, logging, lifetime等等信息。WebApplicationBuilder里首先会创建ConfigurationManager管理配置,Initialize相关配置,并且通过HostBuilder相关静态方法创建HostBuilderContext,在通过HostBuilder里的PopulateServiceCollection静态方法注册ServiceCollection依赖注入容器需要注册的类型等信息,包括IHost对象,这也是最后WebApplication.Run启动的承载系统,并且向Host构造方法依赖注入的根容器ServiceProvide人的委托方法,,这个委托方法在HostApplicationBuilder中实现。
然后创建一个BootstrapHostBuilder(IHostBuilder)用来配置webhost服务以便于填充Services,构造函数里先获取HostBuilderContext对象,通过配置方法对webHostBuilder对象进行配置,这个对象就是new 的GenericWebHostBuilder对象,将GenericWebHostService配置到依赖注入容器ServiceCollection。 GenericWebHostBuilder构造方法中会配置ConfigureHostConfiguration和ConfigureAppConfiguration,然后添加一些需要用到的类型到容器ServiceCollection中。然后通过BootstrapHostBuilder.RunDefaultCallbacks()方法,移除获取到ServiceCollection里的GenericWebHostService的ServiceDescriptor,同时也会设置IServer的服务器Kestral。然后创建代表HostBuilder的ConfigureHostBuilder和配置WebHostBuilder的ConfigureWebHostBuilder。
WebApplicationBuilder里调用Build()方法创建WebApplication:将之前获取到的ServiceDescriptor放回容器ServiceCollection,然后创建开始新的WebApplication,构造函数通过HostApplicationBuilder.Build()传入IHost对象(HostBuilder.ResolveHost()方法),这个也是之前HostApplicationBuilder注入的IHost,
启动WebApplication.Run():通过Listen可以添加新的Url,启动承载服务.
同时也启动了其中注册的GenericWebHostService的StartAsync():
- 首先会设置监听地址,通过IServer里的IServerAddressFeature。
- 通过ApplicationBuilderFactory构造参数IServer.Features,创建ApplicationBuilder,调用ApplicationBuilder构建管道RequestDelegate。
- 创建传输层的管道实现类 HostingApplication(IHttpApplication<Context>)
- 将HostingApplication(IHttpApplication<Context>)作为参数启动IServer服务器,监听地址
请求到达后,根据服务器获取到IFeatureCollection集合,HostingApplication再根据集合构造出HttpContext,最后调用HostingApplication.ProcessRequestAsync()开始利用构建的Application管道处理请求。
ASP.NET Core 应用针对服务生命周期管理的实现原理其实也很简单。在应用程序正常启动后,它会利用注册的服务创建一个作为根容器的 IServiceProvider 对象,我们可以将它称为ApplicationServices。如果应用在处理某个请求的过程中需要采用依赖注入的方式激活某个服务实例,那么它会利用这个 IServiceProvider对象创建一个代表服务范围的 ServiceScope对象,后者会指定一个 IServiceProvider 对象作为子容器,请求处理过程中所需的服务实例均由它来提供,我们可以将它称为RequestServices。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix