Silky微服务框架之服务引擎( 二 )

IServiceCollection对服务进行注册;以及通过遍历所有的Silky模块实例,通过模块的提供的ConfigureServices()的方法通过IServiceCollection对服务进行注册 。

提示
如果熟悉 nopCommerce 框架的小伙伴们应该注意到,SilkyEngine服务引擎的作用与构建与该框架的设计基本是一致的 。
服务引擎的作用服务引擎的SilkyEngine的作用主要由如下几点:
  1. 通过模块加载器ModuleLoader解析和加载模块,关于模块如何解析和加载,请查看下一节模块内容;
  2. 实现服务的依赖注入,本质上来说要么通过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方法时,主要通过AutofacContainerBuilder实现服务的依赖注册 。
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实现服务注册,也是通过服务引擎巧妙的实现:一种方式是通过模块,另外一种方式是通过约定的依赖方式 。

经验总结扩展阅读