模块的定义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
执行关闭模块方法,一般用于各个模块的资源释放;
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()
,该方法通过调用模块管理器的
推荐阅读
- 一篇文章带你了解轻量级Web服务器——Nginx简单入门
- iphone12有无线充电吗_iphone12可以使用无线充电吗
- 如何转账到支付宝(支付宝不绑卡怎么把钱转到微信)
- Seata 环境搭建
- 四十七 SpringCloud微服务实战——搭建企业级开发框架:【移动开发】整合uni-app搭建移动端快速开发框架-添加Axios并实现登录功能
- 记录一次sshd服务启动失败
- 微信小程序仿手机相册组件——简单版
- 3 Python全栈工程师之从网页搭建入门到Flask全栈项目实战 - 入门Flask微框架
- 【Serverless】云函数微信小程序
- ipad如何分屏工作(ipad微信分屏怎么取消)