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

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

模塊的定義Silky是一個包括多個nuget包構(gòu)成的模塊化的框架,每個模塊將程序劃分為一個個小的結(jié)構(gòu),在這個結(jié)構(gòu)中有著自己的邏輯代碼和自己的作用域,不會影響到其他的結(jié)構(gòu) 。
模塊類一般地,一個模塊的定義是通過在該程序集內(nèi)創(chuàng)建一個派生自 SilkyModule的類,如下所示:
public class RpcModule : SilkyModule{}SilkyModule是一個抽象的類,它定義了模塊的基礎(chǔ)方法,體現(xiàn)了模塊在框架中的作用;
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實(shí)現(xiàn)服務(wù)注冊;
  2. RegisterServices()方法中,通過ContainerBuilder實(shí)現(xiàn)服務(wù)注冊;
  3. 在應(yīng)用程序啟動時,通過Initialize()方法實(shí)現(xiàn)模塊的初始化方法;
  4. 在應(yīng)用程序停止時,執(zhí)行Shutdown()方法,可以實(shí)現(xiàn)模塊資源的釋放;
關(guān)于上述第1、2 點(diǎn)的作用, 我們已經(jīng)在服務(wù)引擎一章中做了詳細(xì)的解析;關(guān)于第3、4點(diǎn)的作用,應(yīng)用程序是如何在啟動時調(diào)用Initialize()方法或是在停止時執(zhí)行Shutdown()方法呢?
在構(gòu)建服務(wù)引擎一章中,我們提到,在構(gòu)建服務(wù)引擎時,我們有一項(xiàng)很重要的工作就是注冊了InitSilkyHostedService后臺任務(wù) 。
后臺任務(wù)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. 在后臺任務(wù)StartAsync(),在打印Silky的banner后,在應(yīng)用啟動時注冊一個回調(diào)方法,通過模塊管理器IModuleManager執(zhí)行初始化模塊方法;
  2. 在后臺任務(wù)StopAsync(),在應(yīng)用停止后注冊一個回調(diào)方法,通過模塊管理器IModuleManager執(zhí)行關(guān)閉模塊方法,一般用于各個模塊的資源釋放;
下面,我們查看模塊管理器ModuleManager是如何初始化模塊的:

經(jīng)驗(yàn)總結(jié)擴(kuò)展閱讀