Angular 的DI机制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Angular 的DI机制相关的知识,希望对你有一定的参考价值。

参考技术A

依赖注入(DI)是一种重要的应用设计模式。 DI 是一种编码模式,其中的类会从外部源中请求获取依赖,而不是自己创建它们。
了解DI机制,首先要了解Provider的概念。
provider是什么?
provider是提供商,他们提供什么?提供服务。所以,provider可以create or deliver service。而服务呢,需要有一个提供商。

一个实现了 Provider 接口的对象。一个提供商对象定义了如何获取与 DI 令牌(token) 相关联的可注入依赖。 注入器会使用这个提供商来创建它所依赖的那些类的实例。
Angular 会为其自带的服务在每个注入器中注册它自己的提供商。你也可以自己注册应用所需的自己的服务提供商。

具体的服务是一个类 ,是加上了@injectable()装饰器的类。 它被标记为可注入的服务。你必须先使用provider 提供一个 依赖注入器 (dependency injector)的配置,否则angular无法将它注入到任何地方。
默认情况下,该服务的装饰器是用
@injectable( providedIn: \'root\' )
属性进行配置的,它会为该服务创建一个提供商。root表示该服务的提供商是根注入器。
如何提供服务呢?
provider就像一个说明书,来告知inject如何创建服务。
@NgMoudle() 和@Component()
装饰器都有用一个 providers 元数据选项,在那里你可以配置 NgModule 级或组件级的注入器。

如果某个组件需要用到这个服务,那么不需要自己去创建服务的实例,只需要在构造方法里面添加这个服务的声明就可以了。
服务是作为单例存在于注入器中的,在指定的注入器中,只有一个服务实例。

当组件或服务声明某个依赖项时,该类的构造函数会以参数的形式接收那个依赖项。 通过给这个参数加上 @Optional() 注解,你可以告诉 Angular,该依赖是可选的。

Angular 依赖注入系统中可以在缓存中根据名字查找依赖,也可以通过配置过的提供商来创建依赖。 启动过程中会自动为每个模块创建一个注入器,并被组件树继承。

注入器会提供依赖的一个单例,并把这个单例对象注入到多个组件中。

模块和组件级别的注入器树可以为它们拥有的组件及其子组件提供同一个依赖的不同实例。

你可以为同一个依赖使用不同的提供商来配置这些注入器,这些提供商可以为依赖提供不同的实现。

injector 通过 provider 来创建 service 的 instance。

2019-11-20服务与DI简介

DI -- dependency injection

技术图片

 

当Angular创建组件类的新实例时,它会通过查看该组件类的构造函数,来决定该组件依赖哪些服务或者其他依赖项 ,比如上面的heroService

当Angular发现某个组件依赖某个服务时,它会首先坚持是否该注入器中已经有了那个服务的任何现有实例。如果所请求的服务尚不存在,注入器会使用以前注册的服务提供商制作一个,并把它加入注入器中,然后把该服务返回给Angular

当所有请求的服务已解析并返回时,Angular可以用这些服务实例为参数,调用该组件的构造函数

提供服务

对于要用到的任何服务,你必须至少注册一个提供商。

①服务可以在自已的元数据中把自已注册为提供商,这样可以让自已随处可用

技术图片

 

在根一级提供服务时,Angular会创建一个单一的共享实例,并且把它注入到任何想要它的类中。这种在@Injectable元数据注册提供商的方式还可以让angular能够通过移除那些从未被用过的服务来优化大小

②可以在特定的模块注册提供商,该服务的同一个实例将会对该NgModule中的所有组件可用

技术图片

 

③也可以在组件级注册提供商,你会为该组件的每一个新实例提供该服务的一个新实例

技术图片

 

 

以上是关于Angular 的DI机制的主要内容,如果未能解决你的问题,请参考以下文章

Angular2“没有 t 的提供者!”和未捕获(承诺):错误:DI 错误

Angular依赖注入介绍

Angular项目实战Angular2的脏值检测机制

Angular依赖注入机制与服务的作用范围

基于 TypeScript 的 IoC 与 DI

详解ANGULAR2组件中的变化检测机制(对比ANGULAR1的脏检测)