Como faço um " dynamic service injection"?

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;

        });

    }

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

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

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.

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

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

Isso. A sintaxe não aceita String ou Enun

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

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

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.

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

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

Funciona, mas pra string e enum não

Qual erro que acontece?

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

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

String = javascript
string = typescript

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

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

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

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