Silky微服務框架之服務引擎

構建服務引擎在注冊Silky微服務應用一節中,我們了解到在ConfigureServices階段,通過IServiceCollection的擴展方法AddSilkyServices<T>()除了注冊必要的服務之外,更主要的是構建了服務引擎(IEngine) 。
下面,我們學習在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; // 指定通信管道的加密傳輸協議CommonSilkyHelpers.DefaultFileProvider = new SilkyFileProvider(hostEnvironment); // 構建文件服務提供者services.TryAddSingleton(CommonSilkyHelpers.DefaultFileProvider);// 向services注冊單例的文件服務提供者var engine = EngineContext.Create(); // 創建單例的服務引擎services.AddOptions<AppSettingsOptions>().Bind(configuration.GetSection(AppSettingsOptions.AppSettings)); // 新增AppSettingsOptions配置var moduleLoader = new ModuleLoader(); // 創建模塊加載器engine.LoadModules<T>(services, moduleLoader); // 加載所有模塊services.TryAddSingleton<IModuleLoader>(moduleLoader); // 注冊單例的模塊加載器services.AddHostedService<InitSilkyHostedService>();// 注冊 InitSilkyHostedService 后臺任務服務,該服務用于初始化各個模塊的任務或是在應用停止時釋放模塊資源services.AddSingleton<ICancellationTokenProvider>(NullCancellationTokenProvider.Instance); //注冊默認的CancellationTokenProviderengine.ConfigureServices(services, configuration, hostEnvironment); // 通過服務引擎掃描所有IConfigureService接口的類,其實現類可以通過IServiceCollection對服務進行注冊;以及通過各個模塊的ConfigureServices方法對服務進行注冊return engine; // 返回服務引擎對象}創建服務引擎的對象方法如下所示 , 我們可以看出,服務引擎在整個應用的生命周期是全局單例的 。
internal static IEngine Create(){return Singleton<IEngine>.Instance ?? (Singleton<IEngine>.Instance = new SilkyEngine()); // 服務引擎在應用的整個生命周期是單例的}通過我們對上述代碼注釋可以看出 , 在AddSilkyServices<T>()方法中,在該方法中做了如下關鍵性的工作:

  1. 構建了一個關鍵性的對象 文件服務提供者(SilkyFileProvider) ,該對象主要用于掃描或是獲取指定的文件(例如應用程序集等)以及提供文件夾等幫助方法;
  2. 使用EngineContext創建了服務引擎對象SilkyEngine對象;
  3. 使用IServiceCollection注冊了必要的核心的對象,如:SilkyFileProviderModuleLoader、NullCancellationTokenProvider等;
  4. 創建模塊加載器ModuleLoader對象,并通過服務引擎解析、加載silky模塊,需要指出的是,在這里我們需要指定啟動模塊,系統會根據啟動模塊指定的依賴關系進行排序;
  5. 注冊后臺任務服務InitSilkyHostedService,該服務用于初始化各個模塊的任務或是在應用停止時釋放模塊資源;在各個模塊的初始化工作中完成了很多核心的工作,例如:對應用服務以及服務條目的解析、服務元數據的注冊、服務實例的注冊與更新、Rpc消息監聽者的啟動等等;
  6. 在調用服務引擎的ConfigureServices()方法時,通過服務引擎掃描所有IConfigureService接口的類,通過反射創建實現類的對象,通過IServiceCollection對服務進行注冊;以及通過遍歷所有的Silky模塊實例,通過模塊的提供的ConfigureServices()的方法通過IServiceCollection對服務進行注冊 。
提示
如果熟悉 nopCommerce 框架的小伙伴們應該注意到,SilkyEngine服務引擎的作用與構建與該框架的設計基本是一致的 。
服務引擎的作用服務引擎的SilkyEngine的作用主要由如下幾點:
  1. 通過模塊加載器ModuleLoader解析和加載模塊,關于模塊如何解析和加載,請查看下一節模塊內容;
  2. 實現服務的依賴注入,本質上來說要么通過IServiceCollection服務實現服務注冊,要么通過Autufac提供的ContainerBuilder實現服務注冊;
服務引擎實現服務的依賴注入主要由如下幾種方式實現:
2.1 通過掃描所有IConfigureService

推薦閱讀