Dot NET Core Host - 运作概述图解

https://ithelp.ithome.com.tw/upload/images/20211208/201446148EvXEbwf1h.jpg

Net Core 为一跨平台的应用开发,其此框架上可以加上许多自制服务,称之为容器也不为过。
如果要细说明此框架,完整明了,可以写出一整本厚厚的书。但如果要先了解框架主要的运作过程,尤其是搭配MVC控制器,是可以将此用图解的方式将其轨迹整理出来,将其作出关系图,当作踏入此框架的一个指引,近而未来可以抓出蛛丝马迹来深入探讨。
以下是对一个 Dot NET Core 专案搭配 MVC Controller 的概述图解,使用的 Framework 为 .NET Core 3.1:

先展现出专案的进入点与 Startup 类别(建立专案就会有 Startup 类别可以直接参考):

https://ithelp.ithome.com.tw/upload/images/20211208/20144614MNIg7FZ7AQ.jpg

接着由进入点 Main 来进行 Host 相关建置:

https://ithelp.ithome.com.tw/upload/images/20211208/20144614PYdM9EdrUa.jpg

首先进入第一个函示CreateHostBuilder(),使用静态类别 Host。接着S1的路线新增HostBuilder实体,此为一个架构内部的大容器,包含数个子容器,与其它如 _serviceProviderFactory、_appServices等重要的栏位;也有如驱动的函示如Build、CreateServiceProvider等。沿S2路线,来到此HostBuilder实体的扩增类别,可以找到 ConfugureWebHostDefaults函示,此函示包含相关设定如 Web Server、IIS 、相关provider等设定。当设置好该赋予的设定与预先规划好要做的程序後,来到S3路线的 CreateServiceProvider。这边会执行注册Service,所以首先会到S4建立 ServiceCollection 实体当作容器,其扩充类别提供了重要的注册函示 Add、AddScoped、AddSingleton、AddTransient等,注册的服务会存放到 _desciptors,为ServiceDescriptor集合。
接下来要继续HostBuilder实体的ConfugureWebHostDefaults所执行的事:

https://ithelp.ithome.com.tw/upload/images/20211208/20144614c5RfgYIdJt.jpg

HostBuilder实体的ConfugureWebHostDefaults会新增实体GenericWebHostBuilder,并将此实体传送到静态类别WebHost的ConfugureWebDefaults函示中,做环境的设定、相关服务的注册、IIS的设定及相关建置程序规划。
另外还会呼叫GenericWebHostBuilder的UseStartup函示,它会透过 Microsoft.AspNetCore.Hosting 下的扩增类别作初始化设定後,再呼叫GenericWebHostBuilder的ConfigureServices函示,其先对HostBuilder.ConfigureServices做委派内容;最後离开UseStartup再对HostBuilder.ConfigureServices进行委派,如下:
HostBuilder.ConfigureServices((context, services) => services.AddHostedService());
以上可以视为大部分的设定与委派程序行为,到此时为一个中途段落,接下来是 HostBuilder.Build() ,非常重要,有5大步骤,以下为第一步,即呼叫 HostBuilder.BuildHostConfiguration:

https://ithelp.ithome.com.tw/upload/images/20211208/20144614bcSPMhAKrq.jpg

先新增实体ConfigurationBuilder,并利用ConfigurationBuilder.Build新增ConfigurationRoot实体,回存到HostBuilder的_hostConfiguration。接续foreach处理HostBuilder里的_configureHostConfigActions此一子容器的委派内容,其中一个内容点出来为执行GenericWebHostBuilder.ExecuteHosingStartups(),产生实体HostingStartupWebHostBuilder实体存回自己的_hostingStartupWebHostBuilder,可以利用它来对GenericWebHostBuilder做相关的事务。
第二步为呼叫 HostBuilder.CreateHostingEnvironment,其内容大多对环境做设定。
第三步为呼叫 HostBuilder.CreateHostingBuilderContext,如下:

https://ithelp.ithome.com.tw/upload/images/20211208/201446144S0X2Om8Ux.jpg

新增HostBuilderContext实体,存放了HostBuilder的_hostConfiguration与_hostingEnvironment参考,再回存到HostBuilder的_hostBuilderContext。
第四步呼叫 HostBuilder.BuildAppConfiguration:

https://ithelp.ithome.com.tw/upload/images/20211208/20144614h8cTSqwRl0.jpg

新增了ConfigurationBuilder实体,也一用扩增类别函示新增了ChainedConfigurationSource实体,将HostBuilder的_hostConfiguration参考加入到configuration属性中,再把自己整份实体存到ConfigurationBuilder.Sources;再呼叫ConfigurationBuilder.Build新增实体ConfigurationRoot,回存到HostBuilder的_appConfiguration。
第五步呼叫HostBuilder.CreateServiceProvider:

https://ithelp.ithome.com.tw/upload/images/20211208/201446148EvUkcrrWA.jpg

这步骤和开发者会接触到的Startup类别有密切关系。首先会foreach处理HostBuilder的容器_configureServicesActions,其中一个被处理的事务是去撷取专案内的Startup类别,并利用了StartupLoader.FindMethod方法将Startup类别中的ConfigureServices函式相关资讯存到ConfigureServicesBuilder.MethodInfo属性,然後执行此函式。
此函示可以供开发者注册相关服务,也可将实行DI到Controller建构子参数的实作注册到ServiceCollection的_descriptor中。
最後利用预设的 ServiceFactoryAdapter 与 DefaultServiceProviderFactory,建立了Provider如下:

https://ithelp.ithome.com.tw/upload/images/20211208/201446149dOd4L0jXx.jpg

其以ServiceCollection为参数透过DynamicServiceProviderEngine与父类别ServiceProviderEngine产生CallSiteFactory实体为属性,存回HostBuilder的_appServices。如果要实现已经注册的服务,可以呼叫透过DynamicServiceProviderEngine继承的ServiceProvider中的函示GetService来进行resolve。
回到刚刚Startup类别中的ConfigureServices函式,本专案执行services.AddControllers(),如下:

https://ithelp.ithome.com.tw/upload/images/20211208/20144614kfTWvVtuWD.jpg

然後执行:
services
.AddMvcCore()
.AddApiExplorer()
.AddAuthorization()
.AddCors()
.AddDataAnnotations()
.AddFormatterMappings()
services.AddMvcCore为 ServiceCollection的扩充类别下的AddMvcCore函式,最後产生MvcBuilder实体,其中一个属性Services,为整个ServiceCollection的参考。而此MvcBuilder实体的产生目的,是为之後的AddApiExplorer、AddAuthorization、AddCors、AddDataAnnotations与AddFormatterMappings,以MvcBuilder扩充类别的方式来整合这些函式。这些函式的目的,就是将相关service注册到ServiceCollection中的_descriptor。
最後要展示的是Startup类别中,Configure函式被呼叫的时间点与用途,运作关系如下:

https://ithelp.ithome.com.tw/upload/images/20211208/20144614tPmqHP0g6o.jpg

在HostBuilder.Run()的阶段,其中一个task为 Host.StartAsync(),会先执行产生ApplicationBuilder实体的任务,如上图,此时体会传入GenericWebHostService.Options.ConfigureApplication,再利用 ConfigurationBuilder.Build去执行Startup中的Configure函式。这个函式可以供开发者利用建构好的ApplicaitonBuilder去加入一些MiddleWare,依照顺序执行。
以上是 Dot Net Core 在 Host 建立与设定时,与专案 Startup 类别的互动关系,先建立如地图指引般的参考,供未来可以再进一步更详细的深入探讨时的简介指引。


<<:  【Vue】this = undefined 可能是箭头函式搞的鬼

>>:  Free Ringtone For Mobile Phones

[Day06] 自动转型

两等号与三等号( == 与 === )的差别 在 JavaScript 里一个等号 = 代表的意思是...

Day 18 利用 Kubernetes 建立 Prometheus Service

Kubernetes and Prometheus 安装 Kubernetes 及 建立丛集 htt...

JS 物件的参考特性 DAY59

JS 在将值赋予到变数上时 会有两个特性(Call by value(传值) 与 Call by r...

第十天:在 TeamCity 上完成第一个建置工作

在前一天的练习里,我们虽然只写了一个非常简单的 Hello World 程序,但只要能在 Run 面...

SQL资料库基础实作

接着进行AWS RDS的实作, 以及与地端的基本差异. 在SSMS上, 资料库按右键建立 [New ...