Inyección de Dependencias
Inyección de Dependencias (Dependency Injection) en Angular
INYECCIÓN DE DEPENDENCIAS
Es un patrón de diseño orientado a objetos que permite el manejo de objetos entre componentes y que crea las instancias de la clase o clases automáticamente desde un servicio externo mediante el decorador @Injectable().
SERVICIOS
Los servicios son clases destinadas a la reutilización de código y mantener los datos de forma organizada (los datos no se encuentran en el mismo componente).
Creación de un servicio Angular
ng generate service shared/services/datos --module app
Este servicio permite alojar los datos y mediante el decorador @Injectable permite crear instancias automáticas del objeto en el componente. En el ejemplo siguiente se crea un atributo con el modificador de acceso private y la propiedad readonly que es muy similar a una constante. Al atributo DATOS se le asigna un objeto de tipo User y el método getUser devuelve el resultado. Es necesario tanto en el atributo como en el método getUser especificar el tipo de objeto.
Ejemplo de un servicio implementando inyección de dependencias:
import { Injectable } from '@angular/core';
import { User } from "../model/user";
@Injectable({
providedIn: 'root'
})
export class DatosService {
private readonly DATOS: User = {
nombre: "Mónica",
apellidos: "Cañero",
pais: "España",
ciudad: "Málaga"
};
constructor() { }
getUser(): User {
return this.DATOS;
}
}
Interface para los tipos de dato.
export interface User{
nombre: string;
apellidos: string;
pais: string;
ciudad: string;
}
Solo declarando los parámetros (modificador de acceso, atributo, objeto) el componente crea la instancia automáticamente. En el ejemplo se crea un atributo tipo User y en el método de inicialización se llama al método getUser del servicio creado anteriormente.
import { Component, OnInit } from '@angular/core';
import { User } from "../shared/model/apod";
import { DatosService } from "../shared/services/datos.service";
@Component({
selector: 'ed-home',
templateUrl: './home.component.html',
styleUrls: ['./home.component.css']
})
export class HomeComponent implements OnInit {
user: User;
constructor(private datos: DatosService) { }
ngOnInit() {
this.user = this.datos.getUser();
}
}
De esta forma Angular permite alojar los datos y/o métodos para manejar esos datos desde un servicio externo.
Nota: Desde angular 6 no es necesario importar los módulos al componente principal ya que Angular lo hace automáticamente al crear un servicio desde Angular CLI, añadiéndo providedIn: 'root' al decorador @Injectable.
Para poder comentar es necesario iniciar sesión