Dot NET Core Host - 運作概述圖解

閱讀時間約 9 分鐘
Net Core 為一跨平台的應用開發,其此框架上可以加上許多自製服務,稱之為容器也不為過。
如果要細說明此框架,完整明瞭,可以寫出一整本厚厚的書。但如果要先瞭解框架主要的運作過程,尤其是搭配MVC控制器,是可以將此用圖解的方式將其軌跡整理出來,將其作出關係圖,當作踏入此框架的一個指引,近而未來可以抓出蛛絲馬跡來深入探討。
以下是對一個 Dot NET Core 專案搭配 MVC Controller 的概述圖解,使用的 Framework 為 .NET Core 3.1:
先展現出專案的進入點與 Startup 類別:
Dot NET Core Simple Example — Main and Startup
接著由進入點 Main 來進行 Host 相關建置:
首先進入第一個函示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所執行的事:
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:
先新增實體ConfigurationBuilder,並利用ConfigurationBuilder.Build新增ConfigurationRoot實體,回存到HostBuilder的_hostConfiguration。接續foreach處理HostBuilder裡的_configureHostConfigActions此一子容器的委派內容,其中一個內容點出來為執行GenericWebHostBuilder.ExecuteHosingStartups(),產生實體HostingStartupWebHostBuilder實體存回自己的_hostingStartupWebHostBuilder,可以利用它來對GenericWebHostBuilder做相關的事務。
第二步為呼叫 HostBuilder.CreateHostingEnvironment,其內容大多對環境做設定。
第三步為呼叫 HostBuilder.CreateHostingBuilderContext,如下:
新增HostBuilderContext實體,存放了HostBuilder的_hostConfiguration與_hostingEnvironment參考,再回存到HostBuilder的_hostBuilderContext。
第四步呼叫 HostBuilder.BuildAppConfiguration:
新增了ConfigurationBuilder實體,也一用擴增類別函示新增了ChainedConfigurationSource實體,將HostBuilder的_hostConfiguration參考加入到configuration屬性中,再把自己整份實體存到ConfigurationBuilder.Sources;再呼叫ConfigurationBuilder.Build新增實體ConfigurationRoot,回存到HostBuilder的_appConfiguration。
第五步呼叫HostBuilder.CreateServiceProvider:
這步驟和開發者會接觸到的Startup類別有密切關係。首先會foreach處理HostBuilder的容器_configureServicesActions,其中一個被處理的事務是去擷取專案內的Startup類別,並利用了StartupLoader.FindMethod方法將Startup類別中的ConfigureServices函式相關資訊存到ConfigureServicesBuilder.MethodInfo屬性,然後執行此函式。
此函示可以供開發者註冊相關服務,也可將實行DI到Controller建構子參數的實作註冊到ServiceCollection的_descriptor中。
最後利用預設的 ServiceFactoryAdapter 與 DefaultServiceProviderFactory,建立了Provider如下:
其以ServiceCollection為參數透過DynamicServiceProviderEngine與父類別ServiceProviderEngine產生CallSiteFactory實體為屬性,存回HostBuilder的_appServices。如果要實現已經註冊的服務,可以呼叫透過DynamicServiceProviderEngine繼承的ServiceProvider中的函示GetService來進行resolve。
回到剛剛Startup類別中的ConfigureServices函式,本專案執行services.AddControllers(),如下:
然後執行:
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函式被呼叫的時間點與用途,運作關係如下:
在HostBuilder.Run()的階段,其中一個task為 Host.StartAsync(),會先執行產生ApplicationBuilder實體的任務,如上圖,此時體會傳入GenericWebHostService.Options.ConfigureApplication,再利用 ConfigurationBuilder.Build去執行Startup中的Configure函式。這個函式可以供開發者利用建構好的ApplicaitonBuilder去加入一些MiddleWare,依照順序執行。
以上是 Dot Net Core 在 Host 建立與設定時,與專案 Startup 類別的互動關係,先建立如地圖指引般的參考,供未來可以再進一步更詳細的深入探討時的簡介指引。


    avatar-img
    0會員
    2內容數
    留言0
    查看全部
    avatar-img
    發表第一個留言支持創作者!
    你可能也想看
    Google News 追蹤
    Thumbnail
    這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
    Thumbnail
    11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
    Thumbnail
    Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
    1989 年,NASA 發射的旅行者一號已經快要飛出太陽系,這時美國天文學家 Carl Sagan 提出,要讓感測器轉一下身,幫地球拍一張照片。 這想法當場被 NASA 否決。
    Thumbnail
    波卡圓點(Polka Dot) 是一種由一系列實心圓點構成的花紋。這些圓點通常大小一致,排列緊密,但也有波卡點是由許多大小不同的圓點構成。其中一說波卡點是起源於波蘭捷克的傳統民族舞蹈-波卡爾舞,波蘭話Pulka就是「半步」的意思,兩人成對的跟著節奏繞圈圈的跳法,就像波卡圓點給人的視覺印象,
    Thumbnail
    Cardano和波卡宣布建立戰略合作夥伴關係,這是區塊鏈互通性和延展性演進中的一個重要里程碑。這兩者的合作象徵著...
    Thumbnail
    Cardano (ADA) 與其他主流項目的比較,包含比特幣 (BTC)、乙太坊 (ETH)、波卡 (DOT)、索拉納 (SOL)、ALGO
    當我們是一個API專案,我們可能會有 Swagger , 我們有Swagger之後,可能又是用  NJsonSchema NSwag.AspNetCore NSwag.Core 此時在我們的專案因為有了這三個存在,這是在今日時都還有的問題 我們會跳出錯誤, 偵測到 Microsofe
    Thumbnail
    1990年2月14日,NASA發射的航海家1號剛完成它的首要任務,轉過頭來拍攝它所航行過的行星。地球在這張從40億英里外拍攝的照片中,只是在粒狀照片裡的一個渺小「蒼藍小點」。 而我們的一生,我們的愛與恨,嫉妒與憂愁,快樂與永恆,都發生在這個小點之上。
    Thumbnail
    小和好點的雪山肉桂卷風評絕佳,在網路上有天下第一、肉桂捲界的LV、 LV級的肉桂捲等美稱, 撇開是否名副其實,光門面的景緻就絕對值回票價。小和好點不僅是一個咖啡廳, 完整的說應該是一個景觀商區,包含了未來即將開幕的飯店、餐廳,隨處可見員工正努力修砌庭院草木,隨地皆是網美的拍照聖地。
    Thumbnail
    這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
    Thumbnail
    11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
    Thumbnail
    Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
    1989 年,NASA 發射的旅行者一號已經快要飛出太陽系,這時美國天文學家 Carl Sagan 提出,要讓感測器轉一下身,幫地球拍一張照片。 這想法當場被 NASA 否決。
    Thumbnail
    波卡圓點(Polka Dot) 是一種由一系列實心圓點構成的花紋。這些圓點通常大小一致,排列緊密,但也有波卡點是由許多大小不同的圓點構成。其中一說波卡點是起源於波蘭捷克的傳統民族舞蹈-波卡爾舞,波蘭話Pulka就是「半步」的意思,兩人成對的跟著節奏繞圈圈的跳法,就像波卡圓點給人的視覺印象,
    Thumbnail
    Cardano和波卡宣布建立戰略合作夥伴關係,這是區塊鏈互通性和延展性演進中的一個重要里程碑。這兩者的合作象徵著...
    Thumbnail
    Cardano (ADA) 與其他主流項目的比較,包含比特幣 (BTC)、乙太坊 (ETH)、波卡 (DOT)、索拉納 (SOL)、ALGO
    當我們是一個API專案,我們可能會有 Swagger , 我們有Swagger之後,可能又是用  NJsonSchema NSwag.AspNetCore NSwag.Core 此時在我們的專案因為有了這三個存在,這是在今日時都還有的問題 我們會跳出錯誤, 偵測到 Microsofe
    Thumbnail
    1990年2月14日,NASA發射的航海家1號剛完成它的首要任務,轉過頭來拍攝它所航行過的行星。地球在這張從40億英里外拍攝的照片中,只是在粒狀照片裡的一個渺小「蒼藍小點」。 而我們的一生,我們的愛與恨,嫉妒與憂愁,快樂與永恆,都發生在這個小點之上。
    Thumbnail
    小和好點的雪山肉桂卷風評絕佳,在網路上有天下第一、肉桂捲界的LV、 LV級的肉桂捲等美稱, 撇開是否名副其實,光門面的景緻就絕對值回票價。小和好點不僅是一個咖啡廳, 完整的說應該是一個景觀商區,包含了未來即將開幕的飯店、餐廳,隨處可見員工正努力修砌庭院草木,隨地皆是網美的拍照聖地。