前一節有稍微描述ControllerActionEndpointDataSource中的DefaultActionDescriptorCollectionProvider處理了那些事情。
這節會追蹤主要的執行流程。如下圖:
DefaultActionDescriptorCollectionProvider 類別中的屬性_actionDescriptorProvider,執行 ControllerActionDescriptorProvider.OnProvidersExecuting,進而執行GetDescriptors函式。
由S3-1步驟找到 GetDescriptors 函式,會先透過 GetControllerTypes 新增 ControllerFeature 類別,接著S3-2步驟,透過 IOC機制取得 ApplicationPartManager 。透過之前的HostBuilder做 CreateProvider時,就已經被Resolve過,為Singleten,所以它的 FeatureProvider有存在一個ControllerFeatureProvider;另一個屬性為 ApplicationParts 亦為同時存在,並已存放專案的Assembly資訊。
步驟S3-3,呼叫 ContollerFeatureProvider.PopulateFeature 將 Controller Type 資訊包裝到 ControllerFeature 類別中,步驟S3-4 將此類別傳送到 ApplicationModelFactory.CreateApplicationModel,其會以四種applicationModelProvider來擷取 controller 進一步的資訊。
步驟S3-5會把 Controller Type 會以 ApplicationModelProviderContext 的物件方式傳到 DefaultApplicationModelProvider.OnProviderExcuting 中,擷取如Actions、Attributes、Filters、ControllerProperties等初步資訊,步驟S3-6再以 ControllerModel 類別的 type 指派到 ApplicationModelProviderContext.Result 中。
步驟S3-7會再將更詳細的資訊做整理,最後將ApplicationModelProviderContext.Results 指派到ControllerActionEndpointDataSource._actions。
上圖步驟 S4 ,為這整個 UseEndpoints 的最後步驟,將會執行 EndpointMiddleware 這個 middleware 類別的 Invoke部分。
開發者所導入的 middleware 會怎麼進行,請看下一節的說明。