español - ¿Cuál es el propósito de provisto con el decorador inyectable al generar servicios en Angular 6?
angular documentation español (5)
Al generar servicios en la CLI angular, está agregando metadatos adicionales con una propiedad ''proporcionada en'' con un valor predeterminado de ''raíz'' para el decorador inyectable.
@Injectable({
providedIn: ''root'',
})
¿Qué es exactamente lo que hace provisto? ¿Supongo que esto hace que el servicio esté disponible como un servicio de tipo "global" para toda la aplicación, sin embargo, no estaría más limpio declarar dichos servicios en la matriz de proveedores de AppModule?
ACTUALIZAR:
Para cualquier otra persona, el siguiente párrafo también proporcionó otra buena explicación, en particular, si desea brindar su servicio solo a un módulo de funciones.
Ahora hay una nueva forma recomendada de registrar un proveedor, directamente dentro del decorador
@Injectable()
, usando el nuevo atributoprovidedIn
. Acepta''root''
como un valor o cualquier módulo de su aplicación. Cuando use''root''
, suinjectable
se registrará como un singleton en la aplicación, y no necesita agregarlo a los proveedores del módulo raíz. De manera similar, si usa elprovidedIn: UsersModule
, elinjectable
se registra como proveedor delUsersModule
deUsersModule
sin agregarlo a losproviders
del módulo. "- https://blog.ninja-squad.com/2018/05/04/what-is-new-angular-6/
ACTUALIZACIÓN 2:
Después de una investigación adicional, he decidido que solo es útil haber
providedIn: ''root''
Si desea
provide
un servicio en cualquier módulo que no sea el módulo raíz, entonces es mejor que utilice la matriz de
providers
en los decoradores del módulo de características, de lo contrario estará plagado de dependencias circulares.
Se pueden tener discusiones interesantes aquí:
https://github.com/angular/angular-cli/issues/10170
Según la
Documentation
:
El registro del 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.
Si utiliza el sitio provisto, el inyectable se registra como proveedor del módulo sin agregarlo a los proveedores del módulo.
Desde
Docs
El servicio en sí es una clase que el CLI generó y está decorado con @Injectable. De forma predeterminada, este decorador está configurado con una propiedad proporcionada en, que crea un proveedor para el servicio. En este caso, proporcionadoIn: ''raíz'' especifica que el servicio debe proporcionarse en el inyector raíz.
includedIn le dice a Angular que el inyector raíz es responsable de crear una instancia de su Servicio. Los servicios que se proporcionan de esta manera se ponen automáticamente a disposición de toda la aplicación y no necesitan estar listados en ningún módulo.
Las clases de servicio pueden actuar como sus propios proveedores, por lo que definirlas en el decorador @Injectable es todo el registro que necesita.
providedIn: ''root''
es la forma más fácil y eficiente de brindar servicios desde Angular 6:
- El servicio estará disponible en toda la aplicación como un singleton sin necesidad de agregarlo a la matriz de proveedores de un módulo (como Angular <= 5).
- Si el servicio solo se utiliza dentro de un módulo cargado perezoso, se cargará perezosamente con ese módulo
- Si nunca se usa, no estará contenido en la compilación (árbol sacudido).
Para más información, considere leer la documentation y las preguntas frecuentes de NgModule
Por cierto
- Si no desea un singleton para toda la aplicación, use la matriz de un componente del proveedor.
- Si desea limitar el alcance para que ningún otro desarrollador utilice su servicio fuera de un módulo en particular, use la matriz de NgModule del proveedor.
Desde docs
¿Qué es el decorador inyectable?
Marca una clase como disponible para Injector para creación.
import { Injectable } from ''@angular/core'';
@Injectable({
providedIn: ''root'',
})
export class UserService {
}
El servicio en sí es una clase que el CLI generó y está decorado con @Injectable ().
¿Qué es exactamente lo que hace provisto?
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 de nivel de aplicación en la mayoría de las aplicaciones.
providedIn: Type<any> | ''root'' | null
proporcionadoIn: ''raíz''
Cuando proporciona el servicio en el nivel raíz, Angular crea una única instancia de servicio compartida y la inyecta en cualquier clase que lo solicite. El registro del 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.
provisto: modulo
También es posible especificar que se debe proporcionar un servicio 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 proporcione en el módulo.
import { Injectable } from ''@angular/core'';
import { UserModule } from ''./user.module'';
@Injectable({
providedIn: UserModule,
})
export class UserService {
}
Este método es preferible porque permite la sacudida de árboles del servicio si nada lo inyecta.
Si no es posible especificar en el servicio qué módulo debe proporcionarlo, también puede 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 {
}