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()
,该方法通过调用模块管理器的ShutdownModules()
方法,实现对各个模块资源的释放;
public async Task ShutdownModules(){foreach (var module in _moduleContainer.Modules){await module.Instance.Shutdown(new ApplicationContext(_serviceProvider, _moduleContainer));}}
模块的类型在Silky框架中,我将模块的类型划分为如下几种类型:
- 模块的定义
SilkyModule
: SilkyModule是一个抽象的模块,用于定义模块的概念;其他业务模块必须要派生自该类;
- 业务模块: 直接派生自
SilkyModule
类的非抽象类,Silky框架中,几乎所有的包在通过定义业务模块后从而实现模块化编程的,很多核心的包都是业务模块,如:SilkyModule
、ConsulModule
、DotNettyModule
等等模块都属于业务模块;
- Http类型的业务模块:该类型的业务模块派生自HttpSilkyModule,相比一般的业务模块,该类型的模块增加了
Configure(IApplicationBuilder application)
方法,该类型的模块一般用于通过web主机构建的微服务应用或是网关中,可以在Configure()
方法中通过IApplicationBuilder
引用http中间件,在silky框架中,诸如:CorsModule
、IdentityModule
、MiniProfilerModule
等均是该类型的模块; 需要特别注意的是,需要http业务模块配置的中间件起效果的话,不要忘记需要在Startup
类中的Configure
进行如下配置:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env){app.ConfigureSilkyRequestPipeline();}
- 启动模块:该类型的模块派生自StartUpModule的非抽象类;在模块加载过程中,通过指定启动模块,从而得知模块的依赖关系,模块加载器会通过模块的依赖对模块进行排序,从而影响应用在启动时各个模块的执行的先后顺序;Silky模块预定义了多个启动模块,可以用于不同silky主机的构成:A)
DefaultGeneralHostModule
用于构建普通的业务主机,一般用于托管只提供RPC服务的微服务应用;B)WebSocketHostModule
用于构建提供WebSocket服务能力的业务主机;C)DefaultWebHostModule
用于构建能够提供Http服务的业务主机,对外可以提供http服务,也可以用于内部rpc通信;D)DefaultGatewayHostModule
用于构建网关微服务,一般为微服务集群暴露对外部的http访问端口,通过路由机制,将http请求转发到具体某个服务条目,对内通过RPC进行通信;
模块的加载Silky所有的模块是在什么时候以及如何进行加载和排序的呢?
在之前的构建服务引擎的一章中,我们知道在
AddSilkyServices<T>()
方法中,我们通过泛型T
来指定应用程序的启用模块StartUpModule
类型 。并构建了模块加载器对象ModuleLoader
经验总结扩展阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 国庆节微信祝福语简短
- 木签子可以放微波炉吗
- 一路向阳的微信签名 简短的签名很走心
- 一篇文章带你了解轻量级Web服务器——Nginx简单入门
- 一次性饭盒能放微波炉吗
- 20句 乔迁祝福2023年乔迁新居贺词
- 如何转账到支付宝(支付宝不绑卡怎么把钱转到微信)
- 哪些星座女在爱情里谨小慎微
- iphone12有无线充电吗_iphone12可以使用无线充电吗
- Seata 环境搭建