¿Cuál es el propósito de provideIn con el decorador Injectable al generar Servicios en Angular 6?

Resuelto Stefan Zvonar asked hace 6 años • 8 respuestas

Al generar servicios en Angular CLI, se agregan metadatos adicionales con una propiedad "proporcionada en" con un valor predeterminado de "raíz" para el decorador Injectable.

@Injectable({
  providedIn: 'root',
})

¿Qué hace exactamente provideIn? Supongo que esto hace que el servicio esté disponible como un servicio singleton de tipo "global" para toda la aplicación; sin embargo, ¿no sería más limpio declarar dichos servicios en la matriz de proveedores de AppModule?

Stefan Zvonar avatar Jun 14 '18 08:06 Stefan Zvonar
Aceptado

providedIn: 'root'es la forma más fácil y eficiente de brindar servicios desde Angular 6:

  1. El servicio estará disponible en toda la aplicación como singleton sin necesidad de agregarlo a la matriz de proveedores de un módulo (como Angular <= 5).
  2. Si el servicio solo se utiliza dentro de un módulo con carga diferida, se cargará de forma diferida con ese módulo.
  3. Si nunca se usa, no estará incluido en la compilación (árbol sacudido).

Para obtener más información, considere leer la documentación y las preguntas frecuentes de NgModule.

Por cierto:

  1. Si no desea un singleton para toda la aplicación, utilice en su lugar la matriz de un componente del proveedor.
  2. Si desea limitar el alcance para que ningún otro desarrollador use su servicio fuera de un módulo en particular, use la providersmatriz de NgModule en su lugar.
Mick avatar Oct 26 '2018 12:10 Mick

De Documentos

¿Qué es el decorador inyectable?

Marca una clase como disponible para que Injector la cree.

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

@Injectable({
  providedIn: 'root',
})
export class UserService {
}

El servicio en sí es una clase que generó la CLI y que está decorada con @Injectable().

¿Qué hace exactamente provideIn?

Determina qué inyectores proporcionarán el inyectable, ya sea asociándolo con un @NgModule u otro InjectorType, o especificando que este inyectable debe proporcionarse en el inyector 'raíz', que será el inyector a nivel de aplicación en la mayoría de las aplicaciones.

providedIn: Type<any> | 'root' | null

proporcionado en: 'raíz'

Cuando proporciona el servicio en el nivel raíz, Angular crea una instancia única y compartida de servicio y la inyecta en cualquier clase que lo solicite. Registrar el proveedor en los metadatos @Injectable() también permite a Angular optimizar una aplicación eliminando el servicio de la aplicación compilada si no se utiliza.

proporcionado en: módulo

También es posible especificar que un servicio debe proporcionarse en un @NgModule particular. Por ejemplo, si no desea que un servicio esté disponible para las aplicaciones a menos que importen un módulo que haya creado, puede especificar que el servicio se debe proporcionar en el módulo

import { Injectable } from '@angular/core';
import { UserModule } from './user.module';

@Injectable({
  providedIn: UserModule,
})
export class UserService {
}

Se prefiere este método porque permite la agitación de árboles ( la agitación de árboles es un paso en un proceso de compilación que elimina el código no utilizado de una base de código ) del servicio si no se inyecta nada.

Si no es posible especificar en el servicio qué módulo debe proporcionarlo, también puedes declarar un proveedor para el servicio dentro del módulo:

import { NgModule } from '@angular/core';
import { UserService } from './user.service';

@NgModule({
  providers: [UserService],
})
export class UserModule {
}
Nipuna avatar Apr 18 '2019 07:04 Nipuna