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