se uma classe depende da inicialização da outra tem alguma coisa de meio errado…
mas em todo caso vc consegue definir a ordem recebendo a outra classe no construtor: se eu quero que A rode antes de B, é só a B receber a A no construtor.
Rafael_Guerreiro
Hmmm… O que seria de errado? Esse acoplamento, você diz? Existe alguma saída para esse problema, de forma certa?
Lucas_Cavalcanti
depende
se uma classe depende da execução da outra sem depender dela diretamente, existe um acoplamento escondido que pode gerar bugs estranhos… mas depende muito do caso.
A solução “certa” pra isso depende do problema. A solução gambiarra é forçar essa ordem pelos construtores, do jeito que eu falei na mensagem anterior…
se quiser explicar o porque dessa necessidade, posso ver se tem outra alternativa
Rafael_Guerreiro
Bom,
o primeiro @ApplicationScoped que tem que rodar é um que captura um arquivo .properties com algumas configurações do sistema.
até agora ele só serve para definir a formatação monetária (R$, separador de decimal, separador de milhar)
Ele tem que rodar antes do provider de Relatórios, que tem que rodar depois do provider de SessionFactory.
Os reports, quando inicializados (à partir de uma série de arquivos xml em uma pasta) já têm definido o tipo de formatação monetária quando o campo for CURRENCY. Ele também inspeciona o banco de dados para capturar algumas informações sobre a tabela (tamanho do campo, se é nullable ou não e mais outras coisas). Então ele depende de uma SessionFactory e desses parâmetros, caso nenhuma formatação seja definida.
A ordem fica assim:
ParametersProvider
SessionFactoryProvider
ReportProvider
Esta meio confusa a explicação… Deu para entender?
Lucas_Cavalcanti
Cada um desses caras é um ComponentFactory, certo?
Não é só o ReportProvider receber no construtor os Parameters e a SessionFactory?
isso já garante essa ordem.
Rafael_Guerreiro
Não, só o SessionFactory.
Eu acho que não é uma boa prática, mas os Parametros e os Reports setam uma variável estática para que eu possa acessar sempre o mesmo valor. Mas eu preciso da inicialização por construtor por causa da minha dependência com o ServletContext para capturar a pasta onde se encontram esses arquivos de configurações…
Ele recebe só o SessionFactory, pois os parametros são acessados via métodos estáticos.
Lucas_Cavalcanti
Você está dentro de um ambiente de injeção de dependências, não deveria acessar coisas estaticamente
mude isso pra receber essa variável estática pelo construtor.
Rafael_Guerreiro
Hmmm… Vou fazer isso!
Mas eu preciso injetar uma Lista ou um Set com vários Reports, como é feito isso?
Lucas_Cavalcanti
Cria uma classe Parameters @ApplicationScoped que tem o getReports()
e getters pra tudo que vc tava acessando estaticamente.