这篇文章主要介绍“Angular依赖注入体系中的基本概念是什么”,在日常操作中,相信很多人在Angular依赖注入体系中的基本概念是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Angular依赖注入体系中的基本概念是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
依赖注入
既然要介绍 Angular 框架的依赖注入设计,那么先铺垫一下依赖注入的基本概念。我们常常会搞混依赖倒置原则(DIP)、控制反转(IoC)、依赖注入(DI)这几个概念,因此这里会先简单介绍一下。
依赖倒置原则、控制反转、依赖注入
低耦合、高内聚大概是每个系统的设计目标之一,而为此产生了很多的设计模式和理念,其中便包括依赖倒置原则、控制反转的设计思想。
(1) 依赖倒置原则(DIP)。
依赖倒置原则的原始定义为:
高层模块不应该依赖低层模块,两者都应该依赖其抽象;
抽象不应该依赖细节,细节应该依赖抽象。
简单说便是:模块间不应该直接依赖对方,应该依赖一个抽象的规则(接口或者时抽象类)。
(2) 控制反转(IoC)。
控制反转的定义为:模块间的依赖关系从程序内部提到外部来实例化管理。即对象在被创建的时候,由一个调控系统内所有对象的外界实体控制,并将其所依赖的对象的引用传递(注入)给它。
实现控制反转主要有两种方式:
依赖注入:被动的接收依赖对象
依赖查找:主动索取依赖的对象
(3) 依赖注入。
依赖注入,是控制反转的最为常见的一种技术。
依赖倒置和控制反转两者相辅相成,常常可以一起使用,可有效地降低模块间的耦合。
Angular 中的依赖注入
在 Angular 中,同样使用了依赖注入的技术,DI 框架会在实例化某个类时,向其提供这个类所声明的依赖项(依赖项:指当类需要执行其功能时,所需要的服务或对象)。
Angular 中的依赖注入基本上是围绕着组件或者是模块展开的,主要用于给新建的组件提供依赖。
Angular 中主要的依赖注入机制是注入器机制:
应用中所需的任何依赖,都必须使用该应用的注入器来注册一个提供者,以便注入器可以使用这个提供者来创建新实例
Angular 会在启动过程中,创建全应用级注入器以及所需的其它注入器
这里面主要涉及两个概念,分别是Injector 注入器和Provider 提供商,我们来看看。
Injector 注入器
Injector 注入器用于创建依赖,会维护一个容器来管理这些依赖,并尽可能地复用它们。注入器会提供依赖的一个单例,并把这个单例对象注入到多个组件中。
显然,作为一个用来创建、管理、维护依赖的容器,注入器的功能很简单:创建依赖实例、获取依赖实例、管理依赖实例。我们也可以从抽象类Injector
的源码中看出来:
export abstract class Injector { // 找不到依赖 static THROW_IF_NOT_FOUND = THROW_IF_NOT_FOUND; // NullInjector 是树的顶部 // 如果你在树中向上走了很远,以至于要在 NullInjector 中寻找服务,那么将收到错误消息,或者对于 @Optional(),返回 null static NULL: Injector = new NullInjector(); // 根据提供的 Token 从 Injector 检索实例 abstract get<T>( token: Type<T> | AbstractType<T> | InjectionToken<T>, notFoundValue?: T, flags?: InjectFlags ): T; // 创建一个新的 Injector 实例,该实例提供一个或多个依赖项 static create(options: { providers: StaticProvider[]; parent?: Injector; name?: string; }): Injector; // ??defineInjectable 用于构造一个 InjectableDef // 它定义 DI 系统将如何构造 Token,并且在哪些 Injector 中可用 static ?prov = ??defineInjectable({ token: Injector, providedIn: "any" as any, // ??inject 生成的指令:从当前活动的 Injector 注入 Token factory: () => ??inject(INJECTOR), }); static __NG_ELEMENT_ID__ = InjectorMarkers.Injector; }Angular依赖注入体系中的基本概念是什么