上一節我們證明 Singleton Service 被Resolve後,其記憶體是會被保留起來。
這節接續說明,當dot net core 執行 EndPoint Middleware時,要Resolve出 Controller Class 過程中,ApplicationPartManager 為何在被Resolve的時候就包含 Controller 的組件資訊?
回顧 Dot Net Core 運作概述,有一張圖敘述ApplicationPartManager:
如上圖,當HostBuilder 在執行 Build 函式時,到第五大步驟CreateServiceProvide,會在Startup Class的 ConfigureServices 中呼叫AddMvcCore 函式,這個時間點會對ApplicationPartManager實體做處理,也就是會從 ServiceCollection的擴充函式GetApplicationPartManager 來取得ApplicationPartManager實體,以ServiceCollection. TryAddSingleton來註冊instance,並將Controller所在的Assembly Information 包裝到 ApplicationPart中,最後放到ApplicationPartManager. ApplicationParts集合中。
之後Dot Net Core 會執行 EndPoint Middleware,也會對ApplicationPartManager做Resolve,於”Comparison of Dot Net Core MVC and Asp.NET MVC-Timing of Controller Factory and Provider Decision”這節有敘述的圖:
如上,ControllerActionDescriptorProvider在建構子的參數物件被Resolve時,其ApplicationPartManager 也相同被DI機制Resolve出來。因為是Singleton的Service,所以記憶體都是被保留起來的,也就是ApplicationPartManager是在之前就已經註冊好的Singleton實體。之後透過裏頭已經有的組件資訊,將Controller與 Action 資訊萃取出來執行。