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

Injeção de dependência para escolher qual serviço usar

Eu tenho dois serviços de busca na minha aplicação: ElasticsaerchService e N01BuscaService. Uma interface, SistemaBuscaService, ficaria a cargo de chamar esses serviços de acordo com a escolha do usuário no template de BuscaResultadoComponent. O problema é que a classe que o SistemaBuscaService usa é fixo e não estou conseguindo mudar a injeção para mudar o serviço de busca que o usuário selecionar. Teria algum jeito de fazer a variável global sistemaBusca ser manipulado ou teria que buscar outra alternativa (aceito sugestões)?

SistemaBuscaService

@Injectable()
export abstract class SistemaBuscaService {
  buscaDocs: (txtBusca)=> any;
}
N01BuscaService

@Injectable()
export class N01BuscaService implements SistemaBuscaService {

  constructor(private defaultSv: ServiceDefault){}

  buscaDocs(txtBusca) {
    return this.defaultSv.getServiceGenerico("/entity/versaoregulamento/getPesquisaRegulamentos?txt=" + encodeURI("%"+txtBusca+"%"),false).then((resultado: any[]) =>{
       return resultado;
    });
  }

}
ElasticSearchService

@Injectable()
export class ElasticsearchService implements SistemaBuscaService{

  private client: Client
  private tags: Array<any>= [];
  private regulamentos: Array<Object>= [];

  constructor() {
    if(!this.client){
      this.conectar();
    }
  }

  private conectar(){
    this.client= new Client({
      host: 'http://localhost:9200',
      log: 'trace' //mostra as ações do Elasticsearch no console do browser
    })
  }

  criarIndice(nome){
    return this.client.indices.create({index: nome});
  }

  testeConexao(){
    return this.client.ping({
      requestTimeout: Infinity,
      body: 'Elasticsearch Conectado!!!'
    })
  }



  buscaDocs(texto): any{
    return this.client.search({
      index: 'regulamentos',
      //type: tipo,
      filterPath: ['hits.hits._source.entity', 'hits.total'],
      body: {
        from: 0,
        size: 10000,
        query: {
          bool:{
            should:[
              {match: {_all: texto}}
            ]
          }
        }
      }
    }).then(resultado=> {
      let lista: Array<any>= resultado.hits.hits;
      for(let i=0; i<lista.length; i++){
        this.regulamentos.push(lista[i]._source.entity);
      }
      //console.log(this.regulamentos)
      return this.regulamentos;
    });
  }
}
BuscaResultadoComponent

==>import { N01BuscaService } from '../../services/n01-busca.service';
==>import { ElasticsearchService } from '../../services/elasticsearch.service';
import { SistemaBuscaService } from '../../services/sistema-busca.service';

==>var sistemaBusca: any= ElasticsearchService;

@Component({
  selector: 'app-busca-resultados',
  templateUrl: './busca-resultados.component.html',
  styleUrls: ['./busca-resultados.component.css'],
  providers: [
    {provide: SistemaBuscaService, ==>useClass: sistemaBusca}
  ]
})

...Resto do código
3 respostas

Não sei o que esta querendo fazer, mas se eu precisasse utilizar os três serviços no mesmo componente, eu importaria e injetaria os três e teria uma função para cada um.

Espero ter ajudado

O que eu quero é poder alterar a variável global sistemaBusca através do template para dizer a interface qual serviço de busca ela deve usar. Do jeito que está, a interface SistemaBuscaService está amarrada a apenas um dos serviços de busca

solução!

Como eu disse, injete os três tipos e tenha as funções respectivas para cada uma, basta usar a função e o serviço que deseja em cada momento.