大佬教程收集整理的这篇文章主要介绍了SAP Spartacus 中的依赖注入 Dependency Injection 介绍,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
先了解 Angular 中的依赖注入
依赖项是指某个类执行其功能所需的服务或对象。依赖项注入(DI)是一种设计模式,在这种设计模式中,类会从外部源请求依赖项而不是让类自己来
创建它们。
Angular 的 DI 框架会在实例化某个类时为其提供依赖。你可以使用 Angular DI 来提高应用程序的灵活性和模块化程度。
命令行:ng generate service heroes/hero
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 }]
不同的类可以提供相同的服务。例如,以下代码告诉注入器,当组件使用 Logger 令牌请求一个 logger 时,给它返回一个 BetterLogger.
这样,当@R_691_9616@程序,在 constructor 里使用下面代码试图注入 Logger 时:
constructor(logger: Logger)
运行时我们拿到的就是 BetterLogger 实例。
使用 TypeScript interface 定义一个 AppConfig 类型(略)
基于 AppConfig 类型创建一个常量:
export const HERO_DI_CONFIG: AppConfig = {
apiEndpoint: 'api.heroes.com',
title: 'Dependency Injection'
};
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 是令牌描述信息。
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 组成的数组。
更多jerry的原创文章,尽在:"汪子熙":
以上是大佬教程为你收集整理的SAP Spartacus 中的依赖注入 Dependency Injection 介绍全部内容,希望文章能够帮你解决SAP Spartacus 中的依赖注入 Dependency Injection 介绍所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。