iT邦幫忙

2022 iThome 鐵人賽

DAY 16
1
自我挑戰組

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

[Dot Net Core] (圖解系列) 16. 闡述ControllerFactory形成的方式與時機點

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20220916/20144614ijtrHmWWUB.jpg

上一節展示了利用委派函式保存記憶體內容的技巧,這節要說明與紀錄Dot Net Core在什麼時間點與什麼方式形成ControllerFactory內容。

無論是什麼架構,當要產生Controller時,需要ControllerFactory。在 Dot Net Core中,Host於第一次執行EndpointMiddleware時,會產生ControllerFactory。產生ControllerFactory的技巧正是上一節所提供的內容。

回顧 ”Http Request to Dot Net Core MVC”中的圖:
https://ithelp.ithome.com.tw/upload/images/20220916/20144614tFbJdmNK2T.jpg

在Request 到 MVC Controller 時,上圖S4步驟為透過ControllerFactory of ControllerActionInvokerCacheEntry 來呼叫執行ControllerFactory 委派函式。

在 Host 執行 StartAsync 時,在第一次執行EndpointMiddleware,會在ControllerActionInvokerCache. GetCachedResult做產生ControllerFactory的動作。利用了ControllerFactoryProvider. CreateControllerFactory函式,將ControllerActionDescriptor資訊解析後組出ControllerFactory委派函式。

object CreateController(ControllerContext controllerContext)
{
    var controller = controllerActivator(controllerContext);
    for (var i = 0; i < propertyActivators.Length; i++)
    {
        var propertyActivator = propertyActivators[i];
        propertyActivator(controllerContext, controller);
    }

    return controller;
}

return CreateController;

之後會再將此委派的函式指派到ControllerActionInvokerCacheEntry. ControllerFactory中。ControllerActionInvokerCacheEntry會被指派到ControllerActionInvoker._cacheEntry中。其關係圖如下:

https://ithelp.ithome.com.tw/upload/images/20220916/20144614sPpdxoTQHL.jpg

上圖下方粗的紅色框框處指出了ControllerActionInvokerCacheEntry 是被ControllerActionInvokerCache. GetCachedResult函式中產生出來的,同時指定好ControllerFactory委派函式到ControllerActionInvokerCache.ControllerFactory中,而這個委派函式可以取得由ControllerActionDescriptor產生的資訊所包含的記憶體。後續的動作可以參考”Http Request to Dot Net Core MVC”產生Controller的部分。 以上為ControllerFactory如何產生的一個參考與紀錄。


上一篇
[Dot Net Core] (圖解系列) 15. 委派技巧來保存記憶體內容
下一篇
[Dot Net Core] (延伸應用) 17. 為何使用 Dot Net Core 框架 - 解耦服務於 MicroService
系列文
[Dot Net Core](圖解系列與常用套件)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言