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

ContainerBuilder实现服务的注册和通过IServiceCollection实现服务的注册的效果是一致的;使用ContainerBuilder实现服务的注册的优势在于支持命名服务的注册 。也就是在服务注册的过程中,可以给服务起个名字,在服务解析的过程中,通过名称去解析到指定名称的接口的实现的对象 。
2.2.2 通过约定注册服务
服务引擎SilkyEngine通过调用RegisterDependencies()方法,使用ContainerBuilder实现对约定的规范的服务进行注册 。
public void RegisterDependencies(ContainerBuilder containerBuilder){containerBuilder.RegisterInstance(this).As<IEngine>().SingleInstance();containerBuilder.RegisterInstance(_typeFinder).As<ITypeFinder>().SingleInstance();var dependencyRegistrars = _typeFinder.FindClassesOfType<IDependencyRegistrar>();var instances = dependencyRegistrars.Select(dependencyRegistrar => (IDependencyRegistrar)Activator.CreateInstance(dependencyRegistrar)).OrderBy(dependencyRegistrar => dependencyRegistrar.Order);foreach (var dependencyRegistrar in instances)dependencyRegistrar.Register(containerBuilder, _typeFinder);}在上面的代码中,我们看到通过构建约定注册器(IDependencyRegistrar)的实例,通过约定注册器实现指定服务的注册 。系统存在两个默认的约定注册器:
(1) DefaultDependencyRegistrar,该服务注册器可以实现对标识接口的服务注册;
A) 对继承ISingletonDependency的类注册为单例;B) 对继承ITransientDependency的类注册为瞬态;C) 对继承IScopedDependency的类注册为范围;
(2) NamedServiceDependencyRegistrar 实现了对命名服务的注册;在某个类继承上述标识接口时,如果通过InjectNamedAttribute特性对服务进行命名,那么该服务的将会被命名为该名称的服务,在解析该服务的时候,可以通过名称进行解析 。例如:
// 该服务将会被注册为范围的,并被命名为:DemoService,在服务解析过程中可以通过服务名 DemoService 解析到[InjectNamed("DemoService")]public class DemoService : IScopedDependency{}

  1. 服务引擎提供了多种判断服务是否注册以及服务解析方法;
  2. 服务引擎提供了获取指定的配置项的方法;
  3. 可以通过服务引擎获取类型查找器(TypeFinder)、服务配置器(Configuration)、主机环境变量提供者(IHostEnvironment)、以及主机名(HostName)等信息 。
获取和使用服务引擎在开发过程中,可以通过EngineContext.Current获取服务引擎,并使用服务引擎提供的各个方法,例如:判断服务是否注册、解析服务、获取配置类、获取当前原因的主机名称、或是使用类型查找器(TypeFinder)、服务配置器(Configuration)、主机环境变量提供者(IHostEnvironment)等 。
提示在开发过程中,使用服务引擎的大部分场景是,在不方便实现对某个服务进行构造注入的场景下,通过服务引擎实现对某个服务解析,从而得到该服务的实例 。
【Silky微服务框架之服务引擎】

推荐阅读