content - ¿Qué son los proveedores de Angular2?
ng-content angular 6 (3)
En los providers
configuración de componentes Angular2 providers
encuentra 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 a los proveedores como:
Una variedad de proveedores de inyección de dependencia para los servicios que requiere el componente.
Esta definición recursiva no es muy útil. Una explicación más detallada con un ejemplo realmente ayudaría.
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 dicen: cada vez que alguien requiera "AnyService", proporcione la clase "AnyService".
Ver 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, el constructor se mantendría igual:
constructor( private _anyService: AnyService) {
}
Para comprenderlo mejor, debe comprender cómo funciona la inyección de dependencia en Angular 2, ya que los proveedores están directamente relacionados con ella.
Esta es una lectura obligada para cada desarrollador angular 2.
Registrar inyectables
Los proveedores hacen que los inyectables sean conocidos por el DI de Angular y definen el alcance de un inyectable (servicio).
Jerarquía de inyectores
La 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 de constructor), DI comienza a buscar en el inyector de este componente para los proveedores. Si tiene uno solicita la instancia de este proveedor y lo inyecta.
Si el inyector no tiene un proveedor para la clave solicitada (tipo), entonces se visita el inyector principal, hasta la raíz (arranque) hasta que se encuentre un proveedor y se pueda inyectar su instancia. (Si no se encuentra un proveedor, DI arroja un error).
Definir el alcance de una instancia inyectable
De esta forma 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
El número de lugares que proporcione un inyectable determina cuántas instancias se crearán (solo se crearán instancias si se solicitan).
Si desea una instancia única para toda la aplicación, proporcione un inyectable solo una vez en el componente raíz (o con el programa de bootstrap(AppComponent, [...])
que bootstrap(AppComponent, [...])
el mismo comportamiento.
Si desea una nueva instancia para cada componente A
, luego agréguelo a los proveedores del componente A
(actualización) NgModule flojo y no perezoso
Con la introducción de los módulos NgModule
, se introdujeron niveles adicionales. Los proveedores registrados con módulos que no son de carga lenta se encuentran por encima del componente raíz en la jerarquía.
Los módulos de carga diferida están por encima de los componentes y las 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 de modo perezoso al inyector raíz. Por lo tanto, los módulos cargados perezosos obtienen su propio alcance de raíz.
Ver también https://.com/a/45231440/217408
Los proveedores suelen ser objetos únicos (una instancia) a los que otros objetos tienen acceso mediante la inyección de dependencia (DI).
Si planea usar un objeto varias veces, por ejemplo, el servicio Http
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);
}
}
Esta es una aproximación, pero esa es la idea general detrás de Dependency Injection : dejar que el framework maneje la creación y el mantenimiento de objetos reutilizables ... Proveedor es el término de Angular para estos objetos reutilizables (dependencias).