Angular依赖注入体系中的基本概念是什么

这篇文章主要介绍“Angular依赖注入体系中的基本概念是什么”,在日常操作中,相信很多人在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依赖注入体系中的基本概念是什么