IServiceCollection
对服务进行注册;以及通过遍历所有的Silky模块实例,通过模块的提供的ConfigureServices()
的方法通过IServiceCollection
对服务进行注册 。
提示
如果熟悉 nopCommerce 框架的小伙伴们应该注意到,服务引擎的作用服务引擎的SilkyEngine
服务引擎的作用与构建与该框架的设计基本是一致的 。
SilkyEngine
的作用主要由如下几点:- 通过模块加载器
ModuleLoader
解析和加载模块,关于模块如何解析和加载,请查看下一节模块内容;
- 实现服务的依赖注入,本质上来说要么通过
IServiceCollection
服务实现服务注册,要么通过Autufac提供的ContainerBuilder
实现服务注册;
2.1 通过扫描所有
IConfigureService
接口的类,并通过反射的方式构建实现类的对象,然后可以通过IServiceCollection
对服务进行注册;以及通过遍历所有的Silky模块实例,通过模块的提供的ConfigureServices()
的方法通过IServiceCollection
对服务进行注册 。如下代码为服务引擎提供的
ConfigureServices()
方法源码:// SilkyEngine 实现的ConfigureServices注册服务的方法public void ConfigureServices(IServiceCollection services, IConfiguration configuration,IHostEnvironment hostEnvironment){_typeFinder = new SilkyAppTypeFinder(); // 创建类型查找器ServiceProvider = services.BuildServiceProvider();Configuration = configuration;HostEnvironment = hostEnvironment;HostName = Assembly.GetEntryAssembly()?.GetName().Name;// 解析应用服务主机名称var configureServices = _typeFinder.FindClassesOfType<IConfigureService>(); // 通过查找器查找所有的`IConfigureService`实现类var instances = configureServices.Select(configureService => (IConfigureService)Activator.CreateInstance(configureService));// 通过反射的方式创建`IConfigureService`实现类的实例foreach (var instance in instances) // 遍历`IConfigureService`的实现类的实例,并通过其实例实现通过IServiceCollection对服务的注册instance.ConfigureServices(services, configuration);// configure modulesforeach (var module in Modules) // 遍历各个模块,通过各个模块提供`ConfigureServices`实现服务的注册module.Instance.ConfigureServices(services, configuration);AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;}
在上述代码中,我们可以看到在该方法体内主要完成如下工作:A) 创建类型查找器、构建服务提供者以及为配置器、主机环境变量、主机名等赋值;
B) 使用类型查找器查找到所有
IConfigureService
实现类,并通过反射的方式创建其实例,遍历其实例,其实例通过IServiceCollection
实现对服务的注册;C) 遍历所有的模块,通过模块的实例提供的
ConfigureServices()
方法,通过IServiceCollection
实现对服务的注册;2.2 在上一章注册silky微服务应用中有指出, 执行
ContainerBuilder
方法时,主要通过Autofac
的ContainerBuilder
实现服务的依赖注册 。public static IHostBuilder RegisterSilkyServices<T>(this IHostBuilder builder)where T : StartUpModule{// 其他代码略...builder.UseServiceProviderFactory(new AutofacServiceProviderFactory()) // 替换服务提供者工作类.ConfigureContainer<ContainerBuilder>(builder => // 通过ContainerBuilder实现服务依赖注册{engine.RegisterModules(services, builder);engine.RegisterDependencies(builder);})}
我们看到,如何通过ContainerBuilder
实现服务注册,也是通过服务引擎巧妙的实现:一种方式是通过模块,另外一种方式是通过约定的依赖方式 。
经验总结扩展阅读
- 微信收藏文件删除怎么恢复(微信收藏文件不小心删除怎么恢复)
- 如何删除微信收藏的图片(微信已收藏的图片如何删除)
- 微信收藏怎么永久删除(微信收藏怎样永久删除)
- 微信中我的收藏里文件和粘贴怎么删除(微信收藏里怎么删除所有文件)
- 微信收藏怎么一键删除(微信收藏如何永久删除)
- 微信我的收藏怎么删除(公安局能调取已删微信记录吗)
- 微信看一看收藏怎么删除(一键恢复微信收藏)
- 2021微信收藏如何全部删除(怎样全部删除微信收藏)
- SpringCloud整合分布式事务Seata 1.4.1 支持微服务全局异常拦截
- 受用很久很棒的微信签名 2023成熟惊艳的签名