iT邦幫忙

2022 iThome 鐵人賽

DAY 9
1
自我挑戰組

[Dot Net Core](圖解系列與常用套件)系列 第 9

[Dot Net Core](圖解系列) 9. Resolve Controller class process

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20220909/20144614BeTpVDzYsI.jpg

上一節概述了由Http Request 到 Dot Net Core MVC 的流程,本節會探討Controller 於 Dot Net Core 被Resolve的大致流程。

首先延續上篇文章,ControllerActionInvoker.InvokeAsync 會執行controller instance 的產生:

https://ithelp.ithome.com.tw/upload/images/20220909/20144614ZFm4hW6Q56.jpg

上圖展示ControllerActionInvoker 會收集 ControllerContext、ControllerActionInvokerCacheEntry 的資訊到自己的屬性中,一旦開始執行ControllerActionInvoker.InvokeAsync,會由S1步驟開始,呼叫ControllerActionInvoker.InvokeFilterPipelineAsync,經過S2呼叫Next,到了S3步驟呼叫ControllerActionInvoker.InvokeInnerFilterAsync,此時就會到一個很重要的階段,就是透過 ControllerFactory 去接續產生 Controller instance。

https://ithelp.ithome.com.tw/upload/images/20220909/20144614jKG5QGRtwe.jpg

程式碼:

var controller = controllerActivator(controllerContext);

首先會執行ActivatorUtilities執行 GetService 函式。S1步驟會先由ControllerContext.HttpContext.RequestServices 取得 ServiceProviderEngine.CreateScope,執行此函式可以得到ServiceProviderScope。

接著S2步驟透過由ControllerContext取得Controller Type來當參數執行ServiceProviderScope.GetService,至S3步驟到ServiceProviderEngine.GetService,會呼叫 ServiceProvider的 IServiceProviderEngineCallbackOnResolve。

下圖是將整個呼叫的過程LOG下來,當作軌跡:
https://ithelp.ithome.com.tw/upload/images/20220909/20144614Avbm4D0uHS.jpg

由上圖執行ControllerActionInvoker.InvokeAsync,會從 Authorization Filter Case,接著 Resource Filter Case、Exception Filter Case、Action Case,到了ActionBegin 開始找到 ControllerFactory 產生 controller instance,再到 ActionFilter Case 來執行 Action Method,最後回傳 ActionResult。

以上是大致上的過程概述,提供參考。


上一篇
[Dot Net Core](圖解系列) 8. Http Request to Dot Net Core MVC
下一篇
[Dot Net Core](圖解系列) 10.優秀的套件 - Autofac 如何替代 Dot Net Core 的原生DI機制
系列文
[Dot Net Core](圖解系列與常用套件)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言