選單
GSS 技術部落格
在這個園地裡我們將從技術、專案管理、客戶對談面和大家分享我們多年的經驗,希望大家不管是喜歡或是有意見,都可以回饋給我們,讓我們有機會和大家對話並一起成長!
若有任何問題請來信:gss_crm@gss.com.tw
1 分鐘閱讀時間 (140 個字)

[Dot Net Core](Graphic series)9. Comparison of Dot Net Core MVC and Asp.NET MVC-Timing of Factory

netcorelogo

在 "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的服務。 

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

當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的產生:

上圖中展示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](Graphic series )10. The easiest way...
[Dot Net Core](Graphic series )8. Resolve Controll...
 

評論

尚無評論
已經注冊了? 這裡登入
Guest
2024/04/19, 週五

Captcha 圖像