¿Qué son los proveedores en Angular2?


En la configuración del componente Angular2 providers es una de las claves que podríamos especificar. ¿Cómo se definen estos proveedores y para qué se utilizan?

@Component({
  ..
  providers: [..],
  ..
})

Nota:

La documentación de Angular2 está madurando gradualmente pero aún es escasa. Actualmente define proveedores como:

Una matriz de proveedores de inyección de dependencias para servicios que componente requiere.

Esta definición recursiva no es muy útil. A más detallada una explicación con un ejemplo realmente ayudaría.

Author: Pranjal Mittal, 2016-06-16

4 answers

Los proveedores suelen ser objetos singleton (una instancia), a los que otros objetos tienen acceso a través de la inyección de dependencias (DI).

Si planea usar un objeto varias veces, por ejemplo Http servicio en diferentes componentes, puede solicitar la misma instancia de ese servicio (reutilizarlo). Lo hace con la ayuda de DI al proporcionar una referencia al mismo objeto que DI crea para usted.

@Component){
  ..
  providers: [Http]
}

..en lugar de crear un nuevo objeto cada vez:

@Component){}
class Cmp {
  constructor() {
    // this is pseudo code, doens't work
    this.http = new Http(...options);
  }
}

Esto es una aproximación, pero esa es la idea general detrás de Inyección de dependencias - deje que el marco maneje la creación y el mantenimiento de objetos reutilizables... Proveedor es el término de Angular para estos objetos reutilizables (dependencias).

 41
Author: Sasxa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-30 09:16:44

Registrar inyectables

Los proveedores dan a conocer los inyectables al DI de Angular y definen el alcance de un inyectable (servicio).

Jerarquía de inyectores

El DI de Angular crea un árbol de inyectores (padre > hijo > nieto >...) que se asemeja a la estructura de sus componentes y directivas.

Instancia única por proveedor

Los proveedores se mantienen por inyector. Cada proveedor proporciona una sola instancia de un inyectable.

Búsqueda de proveedores

Cuando un componente o directiva tiene una dependencia (parámetro constructor), DI comienza a buscar proveedores en el inyector de este componente. Si tiene uno, solicita la instancia de este proveedor e inyecta.

Si el inyector no tiene un proveedor para la clave solicitada (tipo), entonces se visita el inyector padre, hasta la raíz (bootstrap) hasta que se encuentra un proveedor y se puede inyectar su instancia. (Si no se encuentra ningún proveedor DI lanza un error).

Definir el alcance de una instancia inyectable

De esta manera puede definir el alcance de un servicio compartido, porque DI comienza a buscar desde el componente donde se solicita una instancia hacia arriba hasta que encuentra una.

Singleton o no

La cantidad de lugares que proporcione un inyectable determina cuántas instancias se crearán (solo se instanciarán si realmente se solicitan).

Si desea una sola instancia para su aplicación completa, a continuación, proporcionar un inyectable solo una vez en el componente raíz (o con bootstrap(AppComponent, [...]) que resulta en el mismo comportamiento.

Si desea una nueva instancia para cada componente A, agréguela a los proveedores del componente A.

(actualización) NgModule perezoso y no perezoso

Con la introducción de los módulos NgModule, se introdujeron niveles adicionales. Los proveedores registrados con módulos no lazy-loaded están por encima del componente raíz en el jerarquía.

Los módulos Lazy-loaded están por encima de los componentes y directivas cargados por estos componentes.

Debido a que los proveedores son de solo lectura después de que se crea un inyector, no hay forma de agregar proveedores desde módulos cargados perezosamente al inyector raíz. Por lo tanto, los módulos lazy loaded obtienen su propio alcance raíz.

Véase también https://stackoverflow.com/a/45231440/217408

 16
Author: Günter Zöchbauer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-08 19:14:47

Piense en los proveedores como una receta que le dice a angular cómo inyectar un servicio.

A menudo declaramos proveedores en angular de esta manera:

providers: [AnyService]

Esto es solo una mano corta para esto:

[new Provider(AnyService, {useClass: AnyService})]

Ambos enfoques están diciendo: Cuando alguien requiere "AnyService", proporcione la clase"AnyService"

Vea que a pesar de que estoy proporcionando la misma clase en el ejemplo anterior, en otro escenario podría hacer algo como esto.

[new Provider(AnyService, {useClass: AnyServiceCustom})]

Pero en ambos escenarios, constructor seguiría siendo el mismo:

constructor( private _anyService: AnyService) {
}

Para entenderlo mejor, necesita entender cómo funciona la inyección de dependencias en Angular 2, ya que los proveedores están directamente relacionados con él.

Esta es una lectura obligada para todos los desarrolladores de angular 2.

Https://angular.io/docs/ts/latest/guide/dependency-injection.html?The%20Provider%20class%20and%20provide%20function#!#injector-providers

 7
Author: Daniel Pliscki,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-26 15:03:54
import { service_name} from '../path';

@Component({

  selector: 'selector_name',     
  templateUrl: './html file name ',
  styleUrls: ['./css file name '],
  providers: [ ./'service_name'];

})
export class AppComponent {

  constructor(private Service_name: service_name) { 
    //enter code here
}
 -3
Author: Vivek Kumar Sahu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-28 09:36:11