Notas de estudio del documento oficial de inyección de dependencia angular

providers: [
        {
          provide: CheckoutDeliveryService,
          useClass: MockCheckoutDeliveryService,
        },

Un proveedor de dependencia configura un inyector con un token DI, que ese inyector usa para proporcionar la versión concreta en tiempo de ejecución de un valor de dependencia. El inyector se basa en la configuración del proveedor para crear instancias de las dependencias que inyecta en componentes, directivas, tuberías y otros servicios.

El proveedor usa un token DI para configurar el inyector. Este último usa el token para crear una instancia específica que se puede usar en tiempo de ejecución. La instancia se puede inyectar en componentes, instrucciones, canalizaciones y otros servicios.

Las siguientes dos redacciones son equivalentes:

  • proveedores: [Logger]
  • [{proporcionar: Logger, useClass: Logger}]

provide 字段 : contiene el token que sirve como clave tanto para localizar un valor de dependencia como para configurar el inyector.

Un token se almacena como clave para localizar un valor dependiente y configurar el inyector.

El segundo valor es el objeto de definición del proveedor El objeto de definición del proveedor le dice al inyector cómo crear el valor dependiente. Además de useClass, existen useExisting, useValue, useFactory, etc.

La segunda propiedad es un objeto de definición de proveedor, que le dice al inyector cómo crear el valor de dependencia. La clave de definición de proveedor puede ser useClass, como en el ejemplo. También puede ser useExisting, useValue o useFactory. Cada una de estas claves proporciona un tipo diferente de dependencia, como se explica a continuación.

Diferentes clases pueden brindar el mismo servicio.

El significado del siguiente código es que si hay un código que requiere un Logger, se devuelve una instancia de BetterLogger.

[{ provide: Logger, useClass: BetterLogger }]

Mira el siguiente código:

@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}`);
  }
}

El método correcto de configuración del inyector:

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

Proveedores de valor

A veces también podemos dejar que el inyector devuelva un objeto preparado previamente, la configuración del proveedor de valor.

Por ejemplo, el siguiente objeto:

// An object in the shape of the logger service
function silentLoggerFn() {}

export const SilentLogger = {
  logs: ['Silent logger says "Shhhhh!". Provided via "useValue"'],
  log: silentLoggerFn
};

Use useValue para devolver este objeto:

[{ provide: Logger, useValue: SilentLogger }]

¿Cómo inyectar solo una cuerda simple?

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

La constante HERO_DI_CONFIG se ajusta a la interfaz AppConfig. Desafortunadamente, no puede usar una interfaz TypeScript como token. En TypeScript, una interfaz es un artefacto en tiempo de diseño y no tiene una representación en tiempo de ejecución (token) que pueda usar el marco DI.

La interfaz en TypeScript es un concepto de tiempo de diseño, y el marco DI requiere un portador de tiempo de ejecución, es decir, el token DI, por lo que la interfaz no puede participar directamente en Angular DI.

Solución 1

Proporcione e inyecte objetos de configuración en NgModule:

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

Solucion 2

Utilice el objeto InjectionToken.

import { InjectionToken } from '@angular/core';

export const APP_CONFIG = new InjectionToken<AppConfig>('app.config');

Ahora puedes registrar las dependencias:

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

Esta dependencia se puede utilizar en cualquier constructor:

constructor(@Inject(APP_CONFIG) config: AppConfig) {
  this.title = config.title;
}

Supongo que te gusta

Origin blog.csdn.net/i042416/article/details/109084811
Recomendado
Clasificación