Como faço um " dynamic service injection"?

21 respostas Resolvido
angular2
T

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

L
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);
}
T

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

L

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.

T

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
L

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

T

Isso. A sintaxe não aceita String ou Enun

L

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

T

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

L

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.

T

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

L

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

T

Funciona, mas pra string e enum não

L

Qual erro que acontece?

T

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

T

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

L

String = javascript
string = typescript

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

T

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

L

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

T

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

L

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

T

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