上一節展示了利用委派函式保存記憶體內容的技巧,這節要說明與紀錄Dot Net Core在什麼時間點與什麼方式形成ControllerFactory內容。
無論是什麼架構,當要產生Controller時,需要ControllerFactory。在 Dot Net Core中,Host於第一次執行EndpointMiddleware時,會產生ControllerFactory。產生ControllerFactory的技巧正是上一節所提供的內容。
回顧 ”Http Request to Dot Net Core MVC”中的圖:
在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中。其關係圖如下:
上圖下方粗的紅色框框處指出了ControllerActionInvokerCacheEntry 是被ControllerActionInvokerCache. GetCachedResult函式中產生出來的,同時指定好ControllerFactory委派函式到ControllerActionInvokerCache.ControllerFactory中,而這個委派函式可以取得由ControllerActionDescriptor產生的資訊所包含的記憶體。後續的動作可以參考”Http Request to Dot Net Core MVC”產生Controller的部分。 以上為ControllerFactory如何產生的一個參考與紀錄。