构建服务引擎在注册Silky微服务应用一节中,我们了解到在ConfigureServices
阶段,通过IServiceCollection
的扩展方法AddSilkyServices<T>()
除了注册必要的服务之外,更主要的是构建了服务引擎(IEngine
) 。
下面,我们学习在IServiceCollection
的扩展方法AddSilkyServices<T>()
中完成了什么样的工作 。如下所示的代码为在包 Silky.Core 的 ServiceCollectionExtensions.cs中提供的扩展方法AddSilkyServices<T>()
。
public static IEngine AddSilkyServices<T>(this IServiceCollection services, IConfiguration configuration,IHostEnvironment hostEnvironment) where T : StartUpModule{ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; // 指定通信管道的加密传输协议CommonSilkyHelpers.DefaultFileProvider = new SilkyFileProvider(hostEnvironment); // 构建文件服务提供者services.TryAddSingleton(CommonSilkyHelpers.DefaultFileProvider);// 向services注册单例的文件服务提供者var engine = EngineContext.Create(); // 创建单例的服务引擎services.AddOptions<AppSettingsOptions>().Bind(configuration.GetSection(AppSettingsOptions.AppSettings)); // 新增AppSettingsOptions配置var moduleLoader = new ModuleLoader(); // 创建模块加载器engine.LoadModules<T>(services, moduleLoader); // 加载所有模块services.TryAddSingleton<IModuleLoader>(moduleLoader); // 注册单例的模块加载器services.AddHostedService<InitSilkyHostedService>();// 注册 InitSilkyHostedService 后台任务服务,该服务用于初始化各个模块的任务或是在应用停止时释放模块资源services.AddSingleton<ICancellationTokenProvider>(NullCancellationTokenProvider.Instance); //注册默认的CancellationTokenProviderengine.ConfigureServices(services, configuration, hostEnvironment); // 通过服务引擎扫描所有IConfigureService接口的类,其实现类可以通过IServiceCollection对服务进行注册;以及通过各个模块的ConfigureServices方法对服务进行注册return engine; // 返回服务引擎对象}
创建服务引擎的对象方法如下所示 , 我们可以看出,服务引擎在整个应用的生命周期是全局单例的 。
internal static IEngine Create(){return Singleton<IEngine>.Instance ?? (Singleton<IEngine>.Instance = new SilkyEngine()); // 服务引擎在应用的整个生命周期是单例的}
通过我们对上述代码注释可以看出 , 在AddSilkyServices<T>()
方法中,在该方法中做了如下关键性的工作:
- 构建了一个关键性的对象 文件服务提供者(
SilkyFileProvider
) ,该对象主要用于扫描或是获取指定的文件(例如应用程序集等)以及提供文件夹等帮助方法;
- 使用
EngineContext
创建了服务引擎对象SilkyEngine
对象;
- 使用
IServiceCollection
注册了必要的核心的对象,如:SilkyFileProvider
、ModuleLoader
、NullCancellationTokenProvider
等;
- 创建模块加载器
ModuleLoader
对象,并通过服务引擎解析、加载silky模块,需要指出的是,在这里我们需要指定启动模块,系统会根据启动模块指定的依赖关系进行排序;
- 注册后台任务服务
InitSilkyHostedService
,该服务用于初始化各个模块的任务或是在应用停止时释放模块资源;在各个模块的初始化工作中完成了很多核心的工作,例如:对应用服务以及服务条目的解析、服务元数据的注册、服务实例的注册与更新、Rpc消息监听者的启动等等;
- 在调用服务引擎的
ConfigureServices()
方法时,通过服务引擎扫描所有IConfigureService
接口的类,通过反射创建实现类的对象,通过IServiceCollection
对服务进行注册;以及通过遍历所有的Silky模块实例,通过模块的提供的ConfigureServices()
的方法通过IServiceCollection
对服务进行注册 。
提示
如果熟悉 nopCommerce 框架的小伙伴们应该注意到,服务引擎的作用服务引擎的SilkyEngine
服务引擎的作用与构建与该框架的设计基本是一致的 。
SilkyEngine
的作用主要由如下几点:- 通过模块加载器
ModuleLoader
解析和加载模块,关于模块如何解析和加载,请查看下一节模块内容;
- 实现服务的依赖注入,本质上来说要么通过
IServiceCollection
服务实现服务注册,要么通过Autufac提供的ContainerBuilder
实现服务注册;
2.1 通过扫描所有
IConfigureService
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 微信收藏文件删除怎么恢复(微信收藏文件不小心删除怎么恢复)
- 如何删除微信收藏的图片(微信已收藏的图片如何删除)
- 微信收藏怎么永久删除(微信收藏怎样永久删除)
- 微信中我的收藏里文件和粘贴怎么删除(微信收藏里怎么删除所有文件)
- 微信收藏怎么一键删除(微信收藏如何永久删除)
- SpringCloud整合分布式事务Seata 1.4.1 支持微服务全局异常拦截
- 微信我的收藏怎么删除(公安局能调取已删微信记录吗)
- 微信看一看收藏怎么删除(一键恢复微信收藏)
- 2021微信收藏如何全部删除(怎样全部删除微信收藏)
- Chrony时间同步服务