Como faço um " dynamic service injection"?

21 respostas Resolvido
angular2
Try

Caros, como faço um " dynamic service injection" com este construtor abaixo? É porque o sonar reclama que existe muitos parametros. “Constructor has too many parameters (9). Maximum allowed is 7.”

export class CadastroPessoaFisicaComponent implements OnInit {

    constructor(@Inject('InformacaoSistema') sistema: BehaviorSubject<InformacaoSistema>,

        private formBuilder: FormBuilder,

        private navegacaoUtilService: NavegacaoUtilService,

        private emailService: EmailService,

        private pessoaService: PessoaService,

        private consultaCepService: ConsultaCepService,

        private mensageriaService: MensageriaService,

        private dialogRef: MatDialog,

        private router: Router) {

        sistema.subscribe((infos) => {

            this.informacoes = infos;

        });

    }

21 Respostas

Lucas_Camara
Solucao aceita

Não conhecia esse dynamic service injection, mas pesquisando, parece que é isso:

Defina no construtor apenas o Injector.

constructor(private injector : Injector) {
  this.navegacaoUtilService = injector.get<NavegacaoUtilService>(NavegacaoUtilService);
}
Try

Você sabe como instalar este injector? O Angular reclama.

Lucas_Camara

Qual a versão do angular?


Talvez seu componente que esteja fazendo mais coisa do que ele deveria. Pense se vc consegue refatorar a ponto de deixar as responsabilidades separadas em outros componentes.

Try

Isso deu certo, agora o problema é quando é uma String ou um tipo enum. Como seri a sintaxe?

public nome?: string,
    public numeroDocumento?: string,
    public numeroTelefone?: string,
    public idKeycloak?: string,
    public tipoPessoa?: TIPO_PESSOA,
    public dataNascimento?: string,
    public situacao?: SituacaoPadraoEnum
Lucas_Camara

Não entendi a dúvida. O que String ou Enum teria a ver com as injeções?

Try

Isso. A sintaxe não aceita String ou Enun

Lucas_Camara

Mas String ou Enum são tipos que vc precisa injetar?

Try

public nome?: string;
public situacao?: SituacaoPadraoEnum;

Lucas_Camara

Assim, sem usar o Injector, em algum momento, vc precisaria fazer algo assim?

constructor(
  public nome?: string,
  public situacao?: SituacaoPadraoEnum
) {}

Pq vc comentou que usando o Injector a sintaxe não aceita String ou enum.

Try

O problema é o Sonar. O Sonar reclama, ele só aceita até 7 parâmetros. Será que existe alguma forma do Sonar ignorar está regra?

Lucas_Camara

Mas usando o Injector tu não falou que tinha funcionado?

Try

Funciona, mas pra string e enum não

Lucas_Camara

Qual erro que acontece?

Try

Agora, fiquei confuso… Porque se eu usar String com S maiusculo funciona

Try

Sabe que esgte é um tipo de dúvida que eu sempre tive, nunca sei se uso string ou String, int ou Integer

Lucas_Camara

String = javascript
string = typescript

Como angular usa typescript, vc deve usar string em minúsculo mesmo.

Try

Seguindo a ideia do Injetor como eu faço para o caso de array?

this.paises = injector.get<Pais[]>(Pais[]);

Pais[] dentro dos parentes não está sendo aceito.

Mensagem:
any - Uma expressão de acesso do elemento deveria receber um argumento.ts(1011) - Exibir o Problema -
Nenhuma correção rápida disponível

Lucas_Camara

Pq vc quer injetar um array? Normalmente, vc injetaria um serviço que seria usado para consultar os paises.

Try

Vou fazer da mesma forma que fiz com string, enum, colocar no args?:{} dentro do constructor.

Lucas_Camara

Uma dúvida: Pq vc precisa injetar um enum ou uma string?

Try

isso é uma longa historia rsrsrsrsrs, por aqui não daria pra contar

Criado 3 de fevereiro de 2022
Ultima resposta 20 de fev. de 2022
Respostas 21
Participantes 2