当前位置:网站首页>SAP Spartacus 中的依赖注入 Dependency Injection 介绍
SAP Spartacus 中的依赖注入 Dependency Injection 介绍
2022-06-26 21:18:00 【华为云】
先了解 Angular 中的依赖注入
依赖项是指某个类执行其功能所需的服务或对象。依赖项注入(DI)是一种设计模式,在这种设计模式中,类会从外部源请求依赖项而不是让类自己来创建它们。
Angular 的 DI 框架会在实例化某个类时为其提供依赖。你可以使用 Angular DI 来提高应用程序的灵活性和模块化程度。
如何创建一个新的可以被注入的 service ?
命令行:ng generate service heroes/hero
自动生成的代码,注意注解 @Injectable:
import { Injectable } from '@angular/core';@Injectable({ providedIn: 'root',})export class HeroService { constructor() { }}@Injectable() 装饰器会指定 Angular 可以在 DI 体系中使用此类。元数据 providedIn: ‘root’ 表示 HeroService 在整个应用程序中都是可见的。
配置提供者
通过配置提供者,你可以把服务提供给那些需要它们的应用部件。
依赖提供者会使用 DI 令牌来配置注入器,注入器会用它来提供这个依赖值的具体的、运行时版本。
如果你把服务类指定为提供者令牌,那么注入器的默认行为是用 new 来实例化那个类。
在下面这个例子中,Logger 类提供了 Logger 的实例。
providers: [Logger]当使用提供者配置注入器时,会将该提供者与依赖项注入令牌(或叫 DI 令牌)关联起来。注入器允许 Angular 创建任何内部依赖项的映射。DI 令牌会充当该映射的键名。
当你使用 HeroService 类的类型来定义构造函数参数时,Angular 会注入与这个 HeroService 类令牌相关联的服务:
constructor(heroService: HeroService)这里构造函数参数 heroService 实际上是一个令牌。
这个配置:
providers: [Logger]实际上是下面写法的简写:
[{ provide: Logger, useClass: Logger }]- provide 属性存有令牌,它作为一个 key,在定位依赖值和配置注入器时使用。
- 第二个属性是一个提供者定义对象,它告诉注入器要如何创建依赖值。 提供者定义对象中的 key 可以是 useClass —— 就像这个例子中一样。 也可以是 useExisting、useValue 或 useFactory。 每一个 key 都用于提供一种不同类型的依赖。
不同的类可以提供相同的服务。例如,以下代码告诉注入器,当组件使用 Logger 令牌请求一个 logger 时,给它返回一个 BetterLogger.
这样,当我们的应用程序,在 constructor 里使用下面代码试图注入 Logger 时:
constructor(logger: Logger)运行时我们拿到的就是 BetterLogger 实例。
injection token 的使用方法
使用 TypeScript interface 定义一个 AppConfig 类型(略)
基于 AppConfig 类型创建一个常量:
export const HERO_DI_CONFIG: AppConfig = { apiEndpoint: 'api.heroes.com', title: 'Dependency Injection'};- 要提供并注入配置对象,请在 @NgModule() 的 providers 数组中指定该对象。
providers: [{ provide: APP_CONFIG, useValue: HERO_DI_CONFIG }],上面代码里 provide 属性 APP_CONFIG 就是一个令牌,我们还需要使用代码创建这个令牌。
import { InjectionToken } from '@angular/core';export const APP_CONFIG = new InjectionToken<AppConfig>('app.config');其中AppConfig 通过类型参数传入令牌构造函数里。app.config 是令牌描述信息。
- 最后一步,在应用程序的构造函数里,用 @Inject,注入这个令牌。运行时,config 的值即为令牌关联的常量:HERO_DI_CONFIG
constructor(@Inject(APP_CONFIG) config: AppConfig) { this.title = config.title;}为什么我们不能直接把第一步用 interface 创建的 AppConfig 作为 provide 的值,而要大费周章,创建一个 InjectionToken 呢?
虽然 TypeScript 的 AppConfig 接口可以在类中提供类型支持,但它在依赖注入时却没有任何作用。在 TypeScript 中,接口是一项设计期工件,它没有可供 DI 框架使用的运行时表示形式或令牌。
当转译器把 TypeScript 转换成 JavaScript 时,接口就会消失,因为 JavaScript 没有接口。
由于 Angular 在运行期没有接口,所以该接口不能作为令牌,也不能注入它。
因此下列代码不能工作:
// Can't use interface as provider token[{ provide: AppConfig, useValue: HERO_DI_CONFIG })]看一个 SAP Spartacus 中 Injection Token 的使用例子:

export const PAGE_LAYOUT_HANDLER = new InjectionToken<PageLayoutHandler[]>( 'PageLayoutHandler');在 Cart.module.ts 里使用到了这个令牌:

最后在 PageLayoutService 里使用到了这个令牌指向的服务实例:PageLayoutHandler 组成的数组。

边栏推荐
- windows系统下怎么安装mysql8.0数据库?(图文教程)
- Fixed length memory pool
- 【山东大学】考研初试复试资料分享
- 网上开户万一免五到底安不安全?
- 诗尼曼家居冲刺A股:年营收近12亿 红星美凯龙与居然之家是股东
- 【protobuf 】protobuf 昇級後帶來的一些坑
- 0基础学c语言(2)
- How to install mysql8.0 database under Windows system? (Graphic tutorial)
- Student information management system based on SSH Framework
- 俞敏洪:新东方并不存在倒下再翻身,摧毁又雄起的逆转
猜你喜欢

Leetcode question brushing: String 02 (reverse string II)

Detailed explanation of retrospective thinking

BN(Batch Normalization) 的理论理解以及在tf.keras中的实际应用和总结

龙芯中科科创板上市:市值357亿 成国产CPU第一股

基于Qt实现的“合成大西瓜”小游戏

c语言99乘法表

Leetcode: String 04 (reverse the words in the string)

Looking back at the moon

12个MySQL慢查询的原因分析

【贝叶斯分类2】朴素贝叶斯分类器
随机推荐
leetcode刷题:字符串01(反转字符串)
Sentinelresource annotation details
SentinelResource注解詳解
leetcode刷题:字符串04(颠倒字符串中的单词)
JWT操作工具类分享
KDD2022 | 基于知识增强提示学习的统一会话推荐系统
C language 99 multiplication table
How to install mysql8.0 database under Windows system? (Graphic tutorial)
DLA模型(分类模型+改进版分割模型) + 可变形卷积
Detailed explanation of retrospective thinking
What are the accounting elements
【贝叶斯分类4】贝叶斯网
在哪家证券公司开户最方便最安全可靠
GameFi 活跃用户、交易量、融资额、新项目持续性下滑,Axie、StepN 能摆脱死亡螺旋吗?链游路在何方?
Muke 8. Service fault tolerance Sentinel
Background search, how to find the website background
后台查找,如何查找网站后台
浏览器事件循环
GEE:计算image区域内像素最大最小值
[most detailed] latest and complete redis interview (42 tracks)