Dot NET Core Host - 運作概述圖解

更新於 發佈於 閱讀時間約 10 分鐘
raw-image

Net Core 為一跨平台的應用開發,其此框架上可以加上許多自製服務,稱之為容器也不為過。

如果要細說明此框架,完整明瞭,可以寫出一整本厚厚的書。但如果要先瞭解框架主要的運作過程,尤其是搭配MVC控制器,是可以將此用圖解的方式將其軌跡整理出來,將其作出關係圖,當作踏入此框架的一個指引,近而未來可以抓出蛛絲馬跡來深入探討。

以下是對一個 Dot NET Core 專案搭配 MVC Controller 的概述圖解,使用的 Framework 為 .NET Core 3.1:

先展現出專案的進入點與 Startup 類別:


raw-image

接著由進入點 Main 來進行 Host 相關建置:

raw-image

首先進入第一個函示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所執行的事:

raw-image


HostBuilder實體的ConfugureWebHostDefaults會新增實體GenericWebHostBuilder,並將此實體傳送到靜態類別WebHost的ConfugureWebDefaults函示中,做環境的設定、相關服務的註冊、IIS的設定及相關建置程式規劃。

另外還會呼叫GenericWebHostBuilder的UseStartup函示,它會透過 Microsoft.AspNetCore.Hosting 下的擴增類別作初始化設定後,再呼叫GenericWebHostBuilder的ConfigureServices函示,其先對HostBuilder.ConfigureServices做委派內容;最後離開UseStartup再對HostBuilder.ConfigureServices進行委派,如下:

HostBuilder.ConfigureServices((context, services) => services.AddHostedService<GenericWebHostService>());

以上可以視為大部分的設定與委派程式行為,到此時為一個中途段落,接下來是 HostBuilder.Build() ,非常重要,有5大步驟,以下為第一步,即呼叫 HostBuilder.BuildHostConfiguration:

raw-image


先新增實體ConfigurationBuilder,並利用ConfigurationBuilder.Build新增ConfigurationRoot實體,回存到HostBuilder的_hostConfiguration。接續foreach處理HostBuilder裡的_configureHostConfigActions此一子容器的委派內容,其中一個內容點出來為執行GenericWebHostBuilder.ExecuteHosingStartups(),產生實體HostingStartupWebHostBuilder實體存回自己的_hostingStartupWebHostBuilder,可以利用它來對GenericWebHostBuilder做相關的事務。

第二步為呼叫 HostBuilder.CreateHostingEnvironment,其內容大多對環境做設定。

第三步為呼叫 HostBuilder.CreateHostingBuilderContext,如下:

raw-image


新增HostBuilderContext實體,存放了HostBuilder的_hostConfiguration與_hostingEnvironment參考,再回存到HostBuilder的_hostBuilderContext。

第四步呼叫 HostBuilder.BuildAppConfiguration:

raw-image

新增了ConfigurationBuilder實體,也一用擴增類別函示新增了ChainedConfigurationSource實體,將HostBuilder的_hostConfiguration參考加入到configuration屬性中,再把自己整份實體存到ConfigurationBuilder.Sources;再呼叫ConfigurationBuilder.Build新增實體ConfigurationRoot,回存到HostBuilder的_appConfiguration。

第五步呼叫HostBuilder.CreateServiceProvider:

raw-image

這步驟和開發者會接觸到的Startup類別有密切關係。首先會foreach處理HostBuilder的容器_configureServicesActions,其中一個被處理的事務是去擷取專案內的Startup類別,並利用了StartupLoader.FindMethod方法將Startup類別中的ConfigureServices函式相關資訊存到ConfigureServicesBuilder.MethodInfo屬性,然後執行此函式。
此函示可以供開發者註冊相關服務,也可將實行DI到Controller建構子參數的實作註冊到ServiceCollection的_descriptor中。
最後利用預設的 ServiceFactoryAdapter 與 DefaultServiceProviderFactory,建立了Provider如下:

raw-image

其以ServiceCollection為參數透過DynamicServiceProviderEngine與父類別ServiceProviderEngine產生CallSiteFactory實體為屬性,存回HostBuilder的_appServices。如果要實現已經註冊的服務,可以呼叫透過DynamicServiceProviderEngine繼承的ServiceProvider中的函示GetService來進行resolve。
回到剛剛Startup類別中的ConfigureServices函式,本專案執行services.AddControllers(),如下:

raw-image

然後執行:

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函式被呼叫的時間點與用途,運作關係如下:

raw-image

在HostBuilder.Run()的階段,其中一個task為 Host.StartAsync(),會先執行產生ApplicationBuilder實體的任務,如上圖,此時體會傳入GenericWebHostService.Options.ConfigureApplication,再利用 ConfigurationBuilder.Build去執行Startup中的Configure函式。這個函式可以供開發者利用建構好的ApplicaitonBuilder去加入一些MiddleWare,依照順序執行。

以上是 Dot Net Core 在 Host 建立與設定時,與專案 Startup 類別的互動關係,先建立如地圖指引般的參考,供未來可以再進一步更詳細的深入探討時的簡介指引。














留言
avatar-img
留言分享你的想法!
avatar-img
Czxdas的沙龍
0會員
2內容數
你可能也想看
Thumbnail
2025 vocus 推出最受矚目的活動之一——《開箱你的美好生活》,我們跟著創作者一起「開箱」各種故事、景點、餐廳、超值好物⋯⋯甚至那些讓人會心一笑的生活小廢物;這次活動不僅送出了許多獎勵,也反映了「內容有價」——創作不只是分享、紀錄,也能用各種不同形式變現、帶來實際收入。
Thumbnail
2025 vocus 推出最受矚目的活動之一——《開箱你的美好生活》,我們跟著創作者一起「開箱」各種故事、景點、餐廳、超值好物⋯⋯甚至那些讓人會心一笑的生活小廢物;這次活動不僅送出了許多獎勵,也反映了「內容有價」——創作不只是分享、紀錄,也能用各種不同形式變現、帶來實際收入。
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
前言 大家好上次我們教了 Gitlab CI/CD 的 extends 如何使用,今天我們要來實際做一個真正佈署上線我們的服務,我們會分成兩個章節,第一部分先教大家怎麼寫 Docker Compose 佈署計畫書,第二部分教大家撰寫 CI/CD 自動化佈署流程計劃書 什麼是 Docker Com
Thumbnail
前言 大家好上次我們教了 Gitlab CI/CD 的 extends 如何使用,今天我們要來實際做一個真正佈署上線我們的服務,我們會分成兩個章節,第一部分先教大家怎麼寫 Docker Compose 佈署計畫書,第二部分教大家撰寫 CI/CD 自動化佈署流程計劃書 什麼是 Docker Com
Thumbnail
打包網頁 在部署網站之前,我們要先來打包我們的網頁前端專案 為什麼要打包呢?什麼是打包呢?這有點像是編譯,如果你寫過 C 應該講到這裡就理解為什麼要這樣做了 在網頁開發中網頁內容最原始就是直接用 html 下去寫,但一個成熟的開發者會善用框架來開發,不論是用 vue 或 react,樣式的部分也會從
Thumbnail
打包網頁 在部署網站之前,我們要先來打包我們的網頁前端專案 為什麼要打包呢?什麼是打包呢?這有點像是編譯,如果你寫過 C 應該講到這裡就理解為什麼要這樣做了 在網頁開發中網頁內容最原始就是直接用 html 下去寫,但一個成熟的開發者會善用框架來開發,不論是用 vue 或 react,樣式的部分也會從
Thumbnail
這篇分享希望能讓你了解 什麼Container、與Kubernetes和Docker是什麼關係,以及Kubernetes中又包含了哪些 組件?
Thumbnail
這篇分享希望能讓你了解 什麼Container、與Kubernetes和Docker是什麼關係,以及Kubernetes中又包含了哪些 組件?
Thumbnail
本篇文章將會介紹C#的基礎構成和字串的使用,若想要更詳細的教學,可以參考前一篇文章,前往Microsoft官方教學學習。
Thumbnail
本篇文章將會介紹C#的基礎構成和字串的使用,若想要更詳細的教學,可以參考前一篇文章,前往Microsoft官方教學學習。
Thumbnail
Autofac為可以幫忙達成DI的套件,其運作可以參考運作描述,與如何協助ASP.NET MVC達成DI。 這次要了解如何為Dot NET Core MVC應用程式達成DI,勢必也要先了解Dot NET Core原本是如何運作的。可以參考 “ ASP.NET Core Host Outline d
Thumbnail
Autofac為可以幫忙達成DI的套件,其運作可以參考運作描述,與如何協助ASP.NET MVC達成DI。 這次要了解如何為Dot NET Core MVC應用程式達成DI,勢必也要先了解Dot NET Core原本是如何運作的。可以參考 “ ASP.NET Core Host Outline d
Thumbnail
Net Core 為一跨平台的應用開發,其此框架上可以加上許多自製服務,稱之為容器也不為過。 如果要細說明此框架,完整明瞭,可以寫出一整本厚厚的書。但如果要先瞭解框架主要的運作過程,尤其是搭配MVC控制器,是可以將此用圖解的方式將其軌跡整理出來,將其作出關係圖,當作踏入此框架的一個指引,近而未來可
Thumbnail
Net Core 為一跨平台的應用開發,其此框架上可以加上許多自製服務,稱之為容器也不為過。 如果要細說明此框架,完整明瞭,可以寫出一整本厚厚的書。但如果要先瞭解框架主要的運作過程,尤其是搭配MVC控制器,是可以將此用圖解的方式將其軌跡整理出來,將其作出關係圖,當作踏入此框架的一個指引,近而未來可
Thumbnail
建議先看過Golang 入門這篇再閱讀這篇! 使用Go官方提供的net/http library就能建立http web伺服器囉!
Thumbnail
建議先看過Golang 入門這篇再閱讀這篇! 使用Go官方提供的net/http library就能建立http web伺服器囉!
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News