模块的定义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模块有如下几个作用:
- 在
ConfigureServices()
方法中,通过IServiceCollection
实现服务注册;
- 在
RegisterServices()
方法中,通过ContainerBuilder
实现服务注册;
- 在应用程序启动时,通过
Initialize()
方法实现模块的初始化方法;
- 在应用程序停止时,执行
Shutdown()
方法,可以实现模块资源的释放;
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();});}}
- 在后台任务
StartAsync()
,在打印Silky的banner后,在应用启动时注册一个回调方法,通过模块管理器IModuleManager
执行初始化模块方法;
- 在后台任务
StopAsync()
,在应用停止后注册一个回调方法,通过模块管理器IModuleManager
执行关闭模块方法,一般用于各个模块的资源释放;
经验总结扩展阅读
- 国庆节微信祝福语简短
- 木签子可以放微波炉吗
- 一路向阳的微信签名 简短的签名很走心
- 一篇文章带你了解轻量级Web服务器——Nginx简单入门
- 一次性饭盒能放微波炉吗
- 20句 乔迁祝福2023年乔迁新居贺词
- 如何转账到支付宝(支付宝不绑卡怎么把钱转到微信)
- 哪些星座女在爱情里谨小慎微
- iphone12有无线充电吗_iphone12可以使用无线充电吗
- Seata 环境搭建