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){}
提示使用2.2.2 通过约定注册服务ContainerBuilder
实现服务的注册和通过IServiceCollection
实现服务的注册的效果是一致的;使用ContainerBuilder
实现服务的注册的优势在于支持命名服务的注册 。也就是在服务注册的过程中,可以给服务起个名字,在服务解析的过程中,通过名称去解析到指定名称的接口的实现的对象 。
服务引擎
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
特性对服务进行命名,那么该服务的将会被命名为该名称的服务,在解析该服务的时候,可以通过名称进行解析 。例如:经验总结扩展阅读
- 微信收藏文件删除怎么恢复(微信收藏文件不小心删除怎么恢复)
- 如何删除微信收藏的图片(微信已收藏的图片如何删除)
- 微信收藏怎么永久删除(微信收藏怎样永久删除)
- 微信中我的收藏里文件和粘贴怎么删除(微信收藏里怎么删除所有文件)
- 微信收藏怎么一键删除(微信收藏如何永久删除)
- 微信我的收藏怎么删除(公安局能调取已删微信记录吗)
- 微信看一看收藏怎么删除(一键恢复微信收藏)
- 2021微信收藏如何全部删除(怎样全部删除微信收藏)
- SpringCloud整合分布式事务Seata 1.4.1 支持微服务全局异常拦截
- 受用很久很棒的微信签名 2023成熟惊艳的签名