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


2.2.1 通过模块注册服务
SilkyModule的定义中,我们看到模块的基类是Autofac.Module,我们在遍历所有的模块实例的过程中,通过ContainerBuilder提供的RegisterModule()方法实现模块指定的服务的注册 。换句话说,就是在在执行RegisterModule()的方法过程中,Autofac会调用模块的提供的RegisterServices(ContainerBuilder builder)实现具体的服务注册 。
public void RegisterModules(IServiceCollection services, ContainerBuilder containerBuilder){containerBuilder.RegisterInstance(this).As<IModuleContainer>().SingleInstance();var assemblyNames = ((AppDomainTypeFinder)_typeFinder).AssemblyNames;foreach (var module in Modules){if (!assemblyNames.Contains(module.Assembly.FullName)){((AppDomainTypeFinder)_typeFinder).AssemblyNames.Add(module.Assembly.FullName);}containerBuilder.RegisterModule((SilkyModule)module.Instance);}}所以在Silky模块的定义SilkyModule中,提供了如下虚方法(RegisterServices),实际上是Autofac的基类Autofac.Module的一个基础方法,在调用containerBuilder.RegisterModule((SilkyModule)module.Instance)时,底层会通过调用模块的Load()实现模块的具体服务的注册 。在Load()方法中,每个模块会调用RegisterServices(builder)实现通过ContainerBuilder对服务进行注册 。
protected override void Load([NotNull] ContainerBuilder builder){base.Load(builder);RegisterServices(builder);}所以,Silky具体的模块可以通过重写RegisterServices([NotNull] ContainerBuilder builder)实现该模块使用ContainerBuilder实现服务的依赖注册 。
protected virtual void RegisterServices([NotNull] ContainerBuilder builder){}

提示使用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特性对服务进行命名,那么该服务的将会被命名为该名称的服务,在解析该服务的时候,可以通过名称进行解析 。例如:

经验总结扩展阅读