国产精品免费嫩草研究院|无遮羞动漫在线观看AV|国产麻豆精品传媒AV国产在线|村在线观看|寂寞情人1正版|韩国床震韩国床震古|精品系列专区久久

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()方法,可以實現模塊資源的釋放;
關于上述第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是如何初始化模塊的:

經驗總結擴展閱讀