Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Instânciando classes com injeção de dependência

Gostaria de saber como poderia/melhor maneira de instânciar uma classe que possua uma injeção de dependência em seu construtor. Por exemplo, eu tenho a classe "A" que depende do serviço "X" e essa dependência está no construtor da classe "A". Até aí tudo bem, mas caso eu queira fazer "let a = new A()" como eu resolveria a dependência? Daria para "pegar" a instância já gerada pelo próprio Angular? Eu teria que gerar uma nova instância?

4 respostas

Uma classe A que tenha uma dependência injetável deve ver injetada na classe que deseja utilizar a classe A Se você usa o operador new está abdicando do container de injeção de dependências do Angular.

Isso não resolve seu problema? Se tiver um exemplo mais concreto eu posso dar outra alternativa que é injetar o Injector e através dele injetar manualmente as dependências. Mas isso só em casos extremos.

Muito obrigado. Poderia me dar um exemplo desse caso extremo?

solução!

Posso sim e ainda com um exemplo concreto. No quarto curso de Angular que será lançado, eu ensino a lidar com um gerenciador de error global. Ele precisa ser carregado antes que suas dependências sejam carregadas para que possa tratar qualquer erro de inicialização dessas dependências. Nesse sentido, não posso simplesmente injetar em seu constructor as dependências de que necessita, porque o Angular instanciará as dependências antes do GlobalErrorHandler. Nesse caso, eu faço a injeção na mão através do serviço Injector no método handleError.

Segue o código resumido, mas completo no que diz respeito à injeção do Injector:

import { ErrorHandler, Injectable, Injector } from "@angular/core";
// importações omitidas
@Injectable()
export class GlobalErrorHandler implements ErrorHandler {

    // injetei o Injector
    constructor(private injector: Injector) {}

    handleError(error: any): void {
        // usando o Injector para criar a instância para nós.
        const userService = this.injector.get(UserService);
        // código omitido
     }

Isso é um caso muito específico dentro do framework. Agora, dentro da sua necessidade específica, você busca o que precisar e passar para o constructor da sua classe.

Sucesso e bom estudo!

Muito bom. Muito obrigado professor.