La función inject permite obtener servicios dentro de componentes, directivas o servicios sin necesidad de definirlos en el constructor. Funciona como un reemplazo de la inyección de dependencias tradicional, pero sin acoplar el código a la clase en sí.
En lugar de escribir:
export class MyService {
constructor(private MyService: OtherService) {}
}
podemos utilizar inject de la siguiente manera:
import { inject } from '@angular/core';
export class MyService {
private MyService = inject(OtherService);
}
Imagina un escenario donde tienes un ParentService abstracto que es extendido por múltiples clases hijas. Con la inyección tradicional en el constructor, cada clase hija debe importar las dependencias solo para pasarlas a la clase padre. Así es como se vería esto:
export abstract class ParentService {
constructor(
protected readonly configKey: string,
protected readonly httpClient: HttpClient,
protected readonly helperService: HelperService,
) {}
}
@Injectable({ providedIn: 'root' })
export class ChildService extends ParentService {
constructor(
protected readonly httpClient: HttpClient,
protected readonly helperService: HelperService,
) {
super('config-key', httpClient, helperService);
}
}
Utilizando inject() y eliminando los redundantes imports.
export abstract class ParentService {
protected abstract readonly configKey: string;
protected readonly httpClient = inject(HttpClient);
protected readonly helperService = inject(HelperService);
}
@Injectable({ providedIn: 'root' })
export class ChildService extends ParentService {
protected readonly configKey = 'config-key';
}
El uso de inject en Angular permite una inyección de dependencias más limpia y flexible, mejorando la escalabilidad del proyecto. Esta función es especialmente útil en aplicaciones grandes, donde el ahorro en líneas de código y la claridad en el diseño pueden marcar una gran diferencia.