Para quem já trabalha com linguagens server side e está familiarizado com orientação a objetos, deve saber que o uso de interfaces em sua aplicação é uma prática altamente recomendada, por conta de diversos motivos, sendo o principal para mim, o desacoplamento entre classes.
O Typescript é um Superset do JavaScript que permite escrevermos códigos com estrutura fortemente tipada, com uma sintaxe muito próxima ao do C#, e que no final das contas, tudo será compilado para JavaScript puro, funcionando em todos os browsers.
Quando usamos Services no Angular 4 (como utilizar Services no Angular 4), utilizamos a Injeção de Dependência nos módulos em que iremos consumir nosso serviço, e em algumas situações desejamos injetar uma interface, pois a implementação desse nosso método poderá ocorrer de maneiras diferentes e não interessa ao nosso módulo saber como isso ocorre.
O problema que temos nessa abordagem, é que Interfaces não são suportadas na injeção de dependência, isso por que o JavaScript não possui essa feature e ocorrerá erro ao executar a compilação.
Para solucionar esse problema, utilizaremos Keys para injetar nossa interface. Vamos lá:
Crie um projeto através do Angular CLI e dê o nome de tutorial- interface, conforme comando abaixo:
ng new tutorial-interfaces
Nota: Caso o angular CLI não crie a pasta node_modules, execute o comando npm install.
Com nosso projeto criado, abra-o em seu editor preferido, no meu caso o VS Code.
Na pasta Src, selecione o arquivo app.component.html e altere para o código abaixo:
<div style="text-align:center">
<h1>
Tutorial de Injeção de Dependência de Interfaces
</h1>
</div>
<h2>Estamos chamando o método: buscarDadosNoBanco() : {{retorno}} </h2>
Feito isso, vamos criar nosso serviço IDadosService, que será uma interface, e declarar o método buscarDadosNoBanco, conforme código abaixo:
export interface IDadosService{
buscarDadosNoBanco():string;
}
Agora, criaremos duas novas classes que irão implementar esse nosso método buscarDadosNoBanco, DadosSQL.ts e DadosOracle.ts.
import { Injectable } from '@angular/core';
import { IDadosService} from './IDadosService';
@Injectable()
export class DadosSQL implements IDadosService{
buscarDadosNoBanco():string{
return"Buscamos os dados no banco SQL Server";
}
}
import { Injectable } from '@angular/core';
import { IDadosService } from './IDadosService';
@Injectable()
export class DadosOracle implements IDadosService {
buscarDadosNoBanco():string{
return "Buscamos os dados no banco ORACLE";
}
}
Note que usamos a marcação @Injectable(), para informar que essa classe pode ser injetada em nossos módulos.
Pronto! Agora temos nossa interface sendo implementada tanto no banco SQL, quanto no Oracle.
O próximo passo é alterarmos nosso módulo para receber nosso serviço e atualizar nosso texto na tela. Vamos ao arquivo app.component.ts e substitua pelo código a seguir:
import { Component } from '@angular/core';
import { IDadosService } from './IDadosService';
import { Inject } from '@angular/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
retorno:string;
constructor(@Inject('IDadosServiceToken') private dadosService: IDadosService ){
this.retorno = this.dadosService.buscarDadosNoBanco();
}
}
import { IDadosService } from './IDadosService';
import { Inject } from '@angular/core';
constructor(@Inject('IDadosServiceToken') private dadosService: IDadosService ){
this.retorno = this.dadosService.buscarDadosNoBanco();
}
Injetamos no nosso construtor a interface IDadosService, utilizando uma Key ‘IDadosServiceToken’, que será definida no próximo passo.
Para finalizar e testar se tudo funciona, vamos no arquivo app.modules.ts e altere para o código abaixo:
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { DadosSQL } from './DadosSQL';
import { DadosOracle } from './DadosOracle';
import { AppComponent } from './app.component';
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule
],
providers: [{provide: 'IDadosServiceToken', useClass: DadosSQL}],
bootstrap: [AppComponent],
})
export class AppModule { }
O que fizemos acima foi, em primeiro lugar, importar nossas classes que serão utilizadas.
Depois, em providers, adicionamos nossa Key, e indicamos qual classe estamos utilizando para implementar nosso método.
Pronto! Rode a aplicação e o resultado será o seguinte:
Experimente trocar no provider, para utilizar a classe Oracle.
Até a próxima!






