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微服務框架之服務引擎】

推薦閱讀