,并且將模塊加載器對象作為服務(wù)引擎的LoadModules()方法參數(shù):
public static IEngine AddSilkyServices<T>(this IServiceCollection services, IConfiguration configuration,IHostEnvironment hostEnvironment) where T : StartUpModule{var moduleLoader = new ModuleLoader();engine.LoadModules<T>(services, moduleLoader);}在服務(wù)引擎SilkyEngine實現(xiàn)類中,除了實現(xiàn)IEngine接口之外,還需要實現(xiàn)了IModuleContainer接口,IModuleContainer只定義了一個只讀屬性Modules,要求通過該屬性獲取所有的模塊;在服務(wù)引擎中,我們通過模塊加載器對象moduleLoader.LoadModules()方法實現(xiàn)對模塊的加載與解析,并對屬性Modules進(jìn)行賦值;
internal sealed class SilkyEngine : IEngine, IModuleContainer{// 其他代碼略...public void LoadModules<T>(IServiceCollection services, IModuleLoader moduleLoader)where T : StartUpModule{Modules = moduleLoader.LoadModules(services, typeof(T));}// 實現(xiàn)IModuleContainer定義的屬性public IReadOnlyList<ISilkyModuleDescriptor> Modules { get; private set; }}模塊加載器ModuleLoader要求傳遞兩個參數(shù),一個是IServiceCollection的對象services,一個是啟動模塊StartupModule的的類型typeof(T);下面我們來描述模塊加載的過程:
- 通過
SilkyModuleHelper.FindAllModuleTypes(startupModuleType)查找到啟動模塊StartupModule類型依賴的所有模塊類型;
- 通過反射創(chuàng)建模塊的實例,并通過
IServiceCollection注冊單例的模塊實例,并創(chuàng)建模塊描述符SilkyModuleDescriptor;
- 根據(jù)模塊的依賴關(guān)系對模塊進(jìn)行排序;
DependsOnAttribute指定的,通過DependsOnAttribute在對模塊的類進(jìn)行標(biāo)注,就可以解析到各個模塊的依賴關(guān)系,從而實現(xiàn)通過模塊的依賴關(guān)系進(jìn)行排序;提示熟悉APB框架的小伙伴應(yīng)該可以看出來,Silky模塊的設(shè)計主要是借鑒了APB框架的模塊設(shè)計,在一些細(xì)節(jié)方面做了調(diào)整 。Silky的核心模塊通過上面的介紹, 我們知道一個模塊類的最重要的工作主要由兩點: 1. 實現(xiàn)服務(wù)的注冊; 2. 在應(yīng)用啟動時或是停止時執(zhí)行指定的方法完成初始化任務(wù)或是釋放資源的任務(wù);
如何判斷是否是silky的核心模塊呢? 核心模塊最重要的一個作用就是在應(yīng)用啟動時,通過
Initialize()方法執(zhí)行該模塊的初始化資源的任務(wù);通過查看源碼,我們發(fā)現(xiàn)大部分silky模塊在應(yīng)用啟動時并沒有重寫
Initialize()方法,也就是說,大部分silky模塊在應(yīng)用啟動過程時主要是完成各個模塊的服務(wù)類的注冊并不需要做什么工作 。
文章插圖
如上圖所示,我們看到silky框架定義的模塊,由如上幾個模塊是在應(yīng)用啟動是完成了主機啟動時的關(guān)鍵性作業(yè);
我們再根據(jù)模塊的依賴關(guān)系,可以看到主機在應(yīng)用啟動時,通過模塊初始化任務(wù)的一個執(zhí)行順序如下所示:
RpcModule --> DotNettyTcpModule | TransactionModule | WebSocketModule | [RpcMonitorModule] --> GeneralHostModule(啟動模塊[StartUpModule])[DefaultGeneralHostModule|WebSocketHostModule|DefaultWebSocketHostModule] 通過上述的依賴關(guān)系,我們可以知道:- Rpc模塊在應(yīng)用啟動時是最早被執(zhí)行;
- 然后依次執(zhí)行: DotNettyTcpModule | TransactionModule | WebSocketModule | [RpcMonitorModule] 等模塊;
- 最后執(zhí)行應(yīng)用啟動模塊指定的初始化方法;
- 實現(xiàn)Rpc消息監(jiān)聽的訂閱;
經(jīng)驗總結(jié)擴展閱讀
- 國慶節(jié)微信祝福語簡短
- 木簽子可以放微波爐嗎
- 一路向陽的微信簽名 簡短的簽名很走心
- 一篇文章帶你了解輕量級Web服務(wù)器——Nginx簡單入門
- 一次性飯盒能放微波爐嗎
- 20句 喬遷祝福2023年喬遷新居賀詞
- 如何轉(zhuǎn)賬到支付寶(支付寶不綁卡怎么把錢轉(zhuǎn)到微信)
- 哪些星座女在愛情里謹(jǐn)小慎微
- iphone12有無線充電嗎_iphone12可以使用無線充電嗎
- Seata 環(huán)境搭建
