iT邦幫忙

2022 iThome 鐵人賽

DAY 11
1
自我挑戰組

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

[Dot Net Core] (圖解系列) 11. Dot Net Core MVC 與 Asp.NET MVC 比較 - Controller的 Factory 與 Provider 的決定時機

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20220911/20144614JE8AfpCM3r.jpg

在 "Http Request to Dot Net Core MVC" 這節有概述當Http Request 進入到.Net Core MVC 時,會透過ActionInvokerFactory來進一步解析Controller與Action 的後續工作。

這時會想到,Dot Net Core MVC Controller Factory 決定類別的形成時機點與 Asp.NET Web MVC 有什麼差異?

回顧 EndpointMiddleware 在一開始執行時,會先透過Dot NET Core 本身的IOC機制所提供的Provider,也就是ServiceProviderEngineScope來取得IActionInvokerFactory的服務。

https://ithelp.ithome.com.tw/upload/images/20220911/20144614JmdmipOW0z.jpg

如上圖,IActionInvokerFactory 會Resolve成ActionInvokerFactory實體。這時候建構子內的參數物件會繼續透過DI被Resolve成實體,其關係圖如下:

https://ithelp.ithome.com.tw/upload/images/20220911/20144614p6e5tvfMH9.jpg

當ControllerFactoryProvider被Resolve出來前,會先將其建構子參數 IControllerFactory 型別Resolve出來,也就是DefaultControllerFactory。

當第一次執行EndpointMiddleware.Invoke時,其過程(參考Http Request to Dot Net Core MVC) 會執行ActionInvokerFactory.CreateInvoker,然後執行ControllerActionInvokerCache.GetCachedResult,這時因為ControllerActionInvokerCacheEntry未被新增實體過,所以會為了新增此實體先準備controllerFactory委派函式。由ControllerFactoryProvider.CreateControllerFactory來準備"CreateController"委派函式並回傳給controllerFactory。此委派函式是讓ControllerActivatorProvider.CreateActivator負責,提供一段程式讓ServiceProviderEngineScope來Resolve出Controller實體。

最後這個可以生成Controller實體的controllerFactory最後被指派到ControllerActionInvokerCacheEntry.ControllerFactory。而如何執行此ControllerFactory可以參考 "Resolve Controller class process"。

接下來我們看一下 ASP.NET Web MVC在什麼時間點決定Factory的產生:
https://ithelp.ithome.com.tw/upload/images/20220911/20144614BmFBGLqccq.jpg

上圖中展示ASP.NET Web MVC,紅色框部分是產生Controller實體的關鍵時間點。MvcHandler會去取得生成 Controller 的 Factory,此Factory之前的初始化會建構 DependencyResolver,將 Controller 類別依照 Type 來產生實體,更進一步使用的是 System.Reflection組件。

此二種MVC最主要的不同是,Dot Net Core 是圍繞IOC的機制來產生Controller Factory,而ASP.NET Web MVC是透過MvcHandler的父類別找到DefaultDependencyResolver來產生Controller Factory。


上一篇
[Dot Net Core](圖解系列) 10.優秀的套件 - Autofac 如何替代 Dot Net Core 的原生DI機制
下一篇
[Dot Net Core] (圖解系列) 12. 以最簡單方法驗證架構中 Resolved Singleton 特性
系列文
[Dot Net Core](圖解系列與常用套件)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言