Silky微服務框架之模塊

模塊的定義Silky是一個包括多個nuget包構成的模塊化的框架,每個模塊將程序劃分為一個個小的結構,在這個結構中有著自己的邏輯代碼和自己的作用域,不會影響到其他的結構 。
模塊類一般地,一個模塊的定義是通過在該程序集內創建一個派生自 SilkyModule的類,如下所示:
public class RpcModule : SilkyModule{}SilkyModule是一個抽象的類,它定義了模塊的基礎方法,體現了模塊在框架中的作用;
SilkyModule模塊定義的核心代碼如下所示:
public abstract class SilkyModule : Autofac.Module, ISilkyModule, IDisposable{protected SilkyModule(){Name = GetType().Name.RemovePostFix(StringComparison.OrdinalIgnoreCase, "Module");}protected override void Load([NotNull] ContainerBuilder builder){base.Load(builder);RegisterServices(builder);}public virtual void ConfigureServices(IServiceCollection services, IConfiguration configuration){}protected virtual void RegisterServices([NotNull] ContainerBuilder builder){}public virtual Task Initialize([NotNull] ApplicationContext applicationContext){return Task.CompletedTask;}public virtual Task Shutdown([NotNull] ApplicationContext applicationContext){return Task.CompletedTask;}public virtual string Name { get; }// 其他代碼略...}通過對SilkyModule模塊代碼定義的分析我們可以得知,一個Silky模塊有如下幾個作用:

  1. ConfigureServices()方法中,通過IServiceCollection實現服務注冊;
  2. RegisterServices()方法中,通過ContainerBuilder實現服務注冊;
  3. 在應用程序啟動時,通過Initialize()方法實現模塊的初始化方法;
  4. 在應用程序停止時,執行Shutdown()方法,可以實現模塊資源的釋放;
【Silky微服務框架之模塊】關于上述第1、2 點的作用, 我們已經在服務引擎一章中做了詳細的解析;關于第3、4點的作用,應用程序是如何在啟動時調用Initialize()方法或是在停止時執行Shutdown()方法呢?
在構建服務引擎一章中,我們提到,在構建服務引擎時,我們有一項很重要的工作就是注冊了InitSilkyHostedService后臺任務 。
后臺任務InitSilkyHostedService的源碼如下所示:
public class InitSilkyHostedService : IHostedService{private readonly IModuleManager _moduleManager;private readonly IHostApplicationLifetime _hostApplicationLifetime;public InitSilkyHostedService(IServiceProvider serviceProvider,IModuleManager moduleManager,IHostApplicationLifetime hostApplicationLifetime){if (EngineContext.Current is SilkyEngine){EngineContext.Current.ServiceProvider = serviceProvider;}_moduleManager = moduleManager;_hostApplicationLifetime = hostApplicationLifetime;}public async Task StartAsync(CancellationToken cancellationToken){Console.WriteLine(@"________/ ____|(_)| || | | (____ | || | __ __\___ \ | || || |/ /| | | |____) || || ||< | |_| | |_____/ |_||_||_|\_\ \__, |__/ ||___/");var version = Assembly.GetExecutingAssembly().GetName().Version;var ver = $"{version.Major}.{version.Minor}.{version.Build}";Console.WriteLine($" :: Silky ::{ver}");_hostApplicationLifetime.ApplicationStarted.Register(async () =>{await _moduleManager.InitializeModules();});}public async Task StopAsync(CancellationToken cancellationToken){_hostApplicationLifetime.ApplicationStopped.Register(async () =>{await _moduleManager.ShutdownModules();});}}
  1. 在后臺任務StartAsync(),在打印Silky的banner后,在應用啟動時注冊一個回調方法,通過模塊管理器IModuleManager執行初始化模塊方法;
  2. 在后臺任務StopAsync(),在應用停止后注冊一個回調方法,通過模塊管理器IModuleManager執行關閉模塊方法,一般用于各個模塊的資源釋放;
下面,我們查看模塊管理器ModuleManager是如何初始化模塊的:
public async Task InitializeModules(){foreach (var module in _moduleContainer.Modules){try{Logger.LogInformation("Initialize the module {0}", module.Name);await module.Instance.Initialize(new ApplicationContext(_serviceProvider, _moduleContainer));}catch (Exception e){Logger.LogError($"Initializing the {module.Name} module is an error, reason: {e.Message}");throw;}}}模塊容器_moduleContainer的屬性_moduleContainer.Modules是通過模塊加載器ModuleLoader加載并通過依賴關系進行排序得到的所有模塊的實例,我們看到通過foreach對所有的模塊實例進行遍歷,并依次執行各個模塊的Initialize()方法 。
同樣的 , 在應用程序停止時,會調用InitSilkyHostedService任務的StopAsync(),該方法通過調用模塊管理器的

推薦閱讀