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

Silky微服務(wù)框架之服務(wù)引擎

構(gòu)建服務(wù)引擎在注冊Silky微服務(wù)應(yīng)用一節(jié)中,我們了解到在ConfigureServices階段,通過IServiceCollection的擴展方法AddSilkyServices<T>()除了注冊必要的服務(wù)之外,更主要的是構(gòu)建了服務(wù)引擎(IEngine) 。
下面,我們學(xué)習(xí)在IServiceCollection的擴展方法AddSilkyServices<T>()中完成了什么樣的工作 。如下所示的代碼為在包 Silky.Core 的 ServiceCollectionExtensions.cs中提供的擴展方法AddSilkyServices<T>()
public static IEngine AddSilkyServices<T>(this IServiceCollection services, IConfiguration configuration,IHostEnvironment hostEnvironment) where T : StartUpModule{ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; // 指定通信管道的加密傳輸協(xié)議CommonSilkyHelpers.DefaultFileProvider = new SilkyFileProvider(hostEnvironment); // 構(gòu)建文件服務(wù)提供者services.TryAddSingleton(CommonSilkyHelpers.DefaultFileProvider);// 向services注冊單例的文件服務(wù)提供者var engine = EngineContext.Create(); // 創(chuàng)建單例的服務(wù)引擎services.AddOptions<AppSettingsOptions>().Bind(configuration.GetSection(AppSettingsOptions.AppSettings)); // 新增AppSettingsOptions配置var moduleLoader = new ModuleLoader(); // 創(chuàng)建模塊加載器engine.LoadModules<T>(services, moduleLoader); // 加載所有模塊services.TryAddSingleton<IModuleLoader>(moduleLoader); // 注冊單例的模塊加載器services.AddHostedService<InitSilkyHostedService>();// 注冊 InitSilkyHostedService 后臺任務(wù)服務(wù),該服務(wù)用于初始化各個模塊的任務(wù)或是在應(yīng)用停止時釋放模塊資源services.AddSingleton<ICancellationTokenProvider>(NullCancellationTokenProvider.Instance); //注冊默認(rèn)的CancellationTokenProviderengine.ConfigureServices(services, configuration, hostEnvironment); // 通過服務(wù)引擎掃描所有IConfigureService接口的類,其實現(xiàn)類可以通過IServiceCollection對服務(wù)進(jìn)行注冊;以及通過各個模塊的ConfigureServices方法對服務(wù)進(jìn)行注冊return engine; // 返回服務(wù)引擎對象}創(chuàng)建服務(wù)引擎的對象方法如下所示,我們可以看出,服務(wù)引擎在整個應(yīng)用的生命周期是全局單例的 。
internal static IEngine Create(){return Singleton<IEngine>.Instance ?? (Singleton<IEngine>.Instance = new SilkyEngine()); // 服務(wù)引擎在應(yīng)用的整個生命周期是單例的}【Silky微服務(wù)框架之服務(wù)引擎】通過我們對上述代碼注釋可以看出,在AddSilkyServices<T>()方法中,在該方法中做了如下關(guān)鍵性的工作:

  1. 構(gòu)建了一個關(guān)鍵性的對象 文件服務(wù)提供者(SilkyFileProvider) ,該對象主要用于掃描或是獲取指定的文件(例如應(yīng)用程序集等)以及提供文件夾等幫助方法;
  2. 使用EngineContext創(chuàng)建了服務(wù)引擎對象SilkyEngine對象;
  3. 使用IServiceCollection注冊了必要的核心的對象,如:SilkyFileProviderModuleLoaderNullCancellationTokenProvider等;
  4. 創(chuàng)建模塊加載器ModuleLoader對象,并通過服務(wù)引擎解析、加載silky模塊,需要指出的是,在這里我們需要指定啟動模塊,系統(tǒng)會根據(jù)啟動模塊指定的依賴關(guān)系進(jìn)行排序;
  5. 注冊后臺任務(wù)服務(wù)InitSilkyHostedService,該服務(wù)用于初始化各個模塊的任務(wù)或是在應(yīng)用停止時釋放模塊資源;在各個模塊的初始化工作中完成了很多核心的工作,例如:對應(yīng)用服務(wù)以及服務(wù)條目的解析、服務(wù)元數(shù)據(jù)的注冊、服務(wù)實例的注冊與更新、Rpc消息監(jiān)聽者的啟動等等;
  6. 在調(diào)用服務(wù)引擎的ConfigureServices()方法時,通過服務(wù)引擎掃描所有IConfigureService接口的類,通過反射創(chuàng)建實現(xiàn)類的對象,通過

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