免费A级毛片无码专区网站-成人国产精品视频一区二区-啊 日出水了 用力乖乖在线-国产黑色丝袜在线观看下-天天操美女夜夜操美女-日韩网站在线观看中文字幕-AV高清hd片XXX国产-亚洲av中文字字幕乱码综合-搬开女人下面使劲插视频

Silky微服務(wù)框架之模塊( 三 )

,并且將模塊加載器對象作為服務(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);下面我們來描述模塊加載的過程:

  1. 通過SilkyModuleHelper.FindAllModuleTypes(startupModuleType) 查找到啟動模塊StartupModule類型依賴的所有模塊類型;
  2. 通過反射創(chuàng)建模塊的實例,并通過IServiceCollection注冊單例的模塊實例,并創(chuàng)建模塊描述符SilkyModuleDescriptor;
  3. 根據(jù)模塊的依賴關(guān)系對模塊進(jìn)行排序;
模塊的依賴關(guā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微服務(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)系,我們可以知道:
  1. Rpc模塊在應(yīng)用啟動時是最早被執(zhí)行;
  2. 然后依次執(zhí)行: DotNettyTcpModule | TransactionModule | WebSocketModule | [RpcMonitorModule] 等模塊;
  3. 最后執(zhí)行應(yīng)用啟動模塊指定的初始化方法;
在上述的過程中,Silky主機在啟動時需要完成如下的工作:
  1. 實現(xiàn)Rpc消息監(jiān)聽的訂閱;

    經(jīng)驗總結(jié)擴展閱讀