0

MapService 인터페이스와 GoogleMapsServiceLeafletMapService의 두 가지 구현이 있다고 가정 해보십시오. 패키지 (또는 Angular2?)가 개발자가 아닌 필요한 구현을 호출하기를 원합니다. 구성 요소에서 나는 서비스의 유형은 인터페이스가되고 싶어요 의미각도로 반전 제어 (IoC) 수행하기

export interface MapService { 
//define my API 
} 

@Injectable() 
export class GoogleMapsService implements MapService { 
//implement the API 
} 

는 (그래서 구현에 따라되지 않음) :

import { Component } from '@angular/core'; 
import { MapService } from './map.service'; 
import { GoogleMapsService } from './google-maps.service'; 

@Component({ 
    template : `...`, 
    providers: [GoogleMapsService] 
}) 

export class MyComponent { 

    constructor(private googleMapsService : MapService) { //notice the type of the service here 
    } 
} 

가 어떻게 그것을 달성 할 수 있는가? 이 모듈 범위에서 같은 일을 할 수

import { Component } from '@angular/core'; 
import { MapService } from './map.service'; 
import { GoogleMapsService } from './google-maps.service'; 

@Component({ 
    template : `...`, 
    providers: [ 
     { provide: MapService, useClass: GoogleMapsService } 
    ] 
}) 

export class MyComponent { 

    constructor(private googleMapsService : MapService) { 
    } 
} 

참고 :

+0

당신이 공식 [문서]를 본 적이 (https://angular.io/docs/ts/latest/guide/dependency- 여기에 코드 조각입니다 injection.html)? – Saravana

+0

DI가 IoC의 형태가 아닌가요? 구체적으로 무엇을하고 싶습니까? – Saravana

+1

서비스를 제공 할 때 토큰을 사용하고'@Inject (theToken) private googleMapsService : MapService)'를 사용하십시오. 하지만 실제로는 99 %의 시간이 필요하지 않으며 JS/TS에서는 구체적인 클래스를 조롱하는 것이 문제가되지 않습니다. –

답변

2

따라서 @ jb-nizet의 훌륭한 의견을 기반으로합니다. 나는 InjectionToken을 사용하여 내가 원하는 것을 할 수 있었다.

import { Injectable, InjectionToken } from '@angular/core'; 
export const GOOGLE_MAPS_IMPL = new InjectionToken<MapService>('googleMapImpl'); 

export interface MapService { 
//define the API 
} 

@Injectable() 
export class GoogleMapsService implements MapService { 
//implement the API 
} 

그리고 구성 요소 :

import { Component, Inject } from '@angular/core'; 
import { MapService } from './map.service'; 
import { GoogleMapsService, GOOGLE_MAPS_IMPL } from './google-maps.service'; 

@Component({ 
    template : `...`, 
    providers: [{ provide: GOOGLE_MAPS_IMPL, useClass: GoogleMapsService }] 
}) 

export class MyComponent { 
    constructor(@Inject(GOOGLE_MAPS_IMPL) private googleMapsService : MapService) { 
    } 
} 
-1

는 공급자 배열에서 다음 구문을 사용합니다.

+0

솔루션이 작동하지 않습니다! 'TS2693 : 'MapService'는 유형을 참조하지만 여기 값으로 사용됩니다. ' – Mitchapp

+2

AFAIK 인터페이스를 토큰으로 사용할 수 없습니다 – yurzui