Angular依赖注入官方文档的学习笔记

简介: Angular依赖注入官方文档的学习笔记
providers: [
        {
          provide: CheckoutDeliveryService,
          useClass: MockCheckoutDeliveryService,
        },

image.pngprovider使用一个DI token配置injector,后者使用该token创建一个具体的能用于运行时的实例,该实例可以注入到Component,指令,管道和其他服务里。


下列两种写法等价:


providers: [Logger]

[{ provide: Logger, useClass: Logger }]

provide字段:holds the token that serves as the key for both locating a dependency value and configuring the injector.


存储了一个token,作为定位一个依赖值和配置injector的key.


第二个值是provider definition object,provider的定义对象,告诉injector如何创建被依赖的值。除了useClass之外,还有useExisting, useValue, useFactory等等。


The second property is a provider definition object, which tells the injector how to create the dependency value. The provider-definition key can be useClass, as in the example. It can also be useExisting, useValue, or useFactory. Each of these keys provides a different type of dependency, as discussed below.


不同的class可以provide同一个服务。


下列代码的含义是,如果有代码需要一个Logger,那么返回一个BetterLogger实例。


[{ provide: Logger, useClass: BetterLogger }]

看下面这段代码:

@Injectable()
export class EvenBetterLogger extends Logger {
  constructor(private userService: UserService) { super(); }
  log(message: string) {
    const name = this.userService.user.name;
    super.log(`Message to ${name}: ${message}`);
  }
}

正确的injector配置方式:

[ UserService,
  { provide: Logger, useClass: EvenBetterLogger }]

Value providers

有时我们也可以让injector返回一个事先准备好的对象,即value provider的配置。

比如下面这个对象:

// An object in the shape of the logger service
function silentLoggerFn() {}
export const SilentLogger = {
  logs: ['Silent logger says "Shhhhh!". Provided via "useValue"'],
  log: silentLoggerFn
};

使用useValue返回这个对象:

[{ provide: Logger, useValue: SilentLogger }]

如何只注入一个简单的字符串呢?

export const HERO_DI_CONFIG: AppConfig = {
  apiEndpoint: 'api.heroes.com',
  title: 'Dependency Injection'
};

image.pngTypeScript里的接口是一个design time的概念,而DI框架需要一个运行时载体即DI token,因此接口并不能直接参与到Angular的DI中去。

解决方案1

在NgModule里提供和注入configuration对象:

providers: [
  UserService,
  { provide: APP_CONFIG, useValue: HERO_DI_CONFIG }
],

解决方案2

使用InjectionToken object.

import { InjectionToken } from '@angular/core';
export const APP_CONFIG = new InjectionToken<AppConfig>('app.config');

现在就可以注册依赖了:

providers: [{ provide: APP_CONFIG, useValue: HERO_DI_CONFIG }]

在任何构造函数里可以使用这个依赖:

constructor(@Inject(APP_CONFIG) config: AppConfig) {
  this.title = config.title;
}
相关文章
|
2月前
|
前端开发 容器
前端框架与库 - Angular模块与依赖注入
【7月更文挑战第17天】探索Angular的模块化和依赖注入:模块用于组织组件、服务等,通过`@NgModule`声明。依赖注入简化类间依赖管理,但面临模块重复导入、服务作用域不当和依赖循环等问题。解决策略包括规划模块结构、正确设置服务作用域和使用工厂函数打破循环依赖。遵循最佳实践,构建高效、可维护的Angular应用。
53 17
|
2月前
|
设计模式 JavaScript 测试技术
Angular服务与依赖注入机制详解
【7月更文挑战第17天】Angular的服务与依赖注入机制为构建模块化、可维护和可扩展的应用程序提供了强大的支持。通过合理定义和使用服务,以及利用依赖注入来管理依赖关系,我们可以编写出更加清晰、可维护和可测试的代码。希望本文能帮助你更好地理解和应用Angular的服务与依赖注入机制。
|
3月前
|
JavaScript IDE 测试技术
angular环境搭建文档【上篇】
angular环境搭建文档【上篇】
38 0
|
11月前
|
搜索推荐
Angular 依赖注入错误消息:ERROR Error NullInjectorError No provider for XX
Angular 依赖注入错误消息:ERROR Error NullInjectorError No provider for XX
|
10月前
|
设计模式 监控 测试技术
Angular 使用 Constructor Parameters 进行依赖注入的优缺点
Angular 使用 Constructor Parameters 进行依赖注入的优缺点
|
10月前
|
设计模式
Angular 依赖注入领域里 optional constructor parameters 的概念介绍
Angular 依赖注入领域里 optional constructor parameters 的概念介绍
|
10月前
Angular 依赖注入系统里 Injection token PLATFORM_ID 的使用场景
Angular 依赖注入系统里 Injection token PLATFORM_ID 的使用场景
|
10月前
|
移动开发 网络架构 HTML5
Angular 依赖注入系统里 Injection token APP_BASE_HREF 的使用场景
Angular 依赖注入系统里 Injection token APP_BASE_HREF 的使用场景
|
10月前
|
开发者
Angular 两种依赖注入的实现方法介绍
Angular 两种依赖注入的实现方法介绍
|
12月前
|
存储 缓存 JavaScript
Angular Universal 学习笔记
Angular Universal 学习笔记