2016-09-01 2 views
1

サービスをコンポーネントに注入する必要があります。これらのすべては、以下の例に示すようにapp.moduleで指定されています。@NgModule、@Injectable @Componenet:依存性注入とコードの再利用

私の現在の理解は、角度依存性注入は、インターフェイスではなくクラスでのプログラミングをサポートしていることです。

例:私は2つのサービスを持っています。 DogServiceとCatServiceの両方がAnimalServiceInferfaceを実装しています。

export interface AnimalServiceInferface { 
    makeSound(): String; 
} 

@Injectable() 
export class DogService implements AnimalServiceInferface { 
    makeSound(): String { 
     return "Woof"; 
    } 
} 

@Injectable() 
export class CatService implements AnimalServiceInferface { 
    makeSound(): String { 
     return "Woof"; 
    } 
} 

が、私はその後、その後、この

@NgModule({ 
    imports: [ 
     APP_ROUTES, 
     BrowserModule 
    ], 
    declarations: [ 
     AnimalComponent 
    ], 
    providers: [ 
     CatService, 
     DogService 
    ], 
    bootstrap: [ 
     AppComponent 
    ] 
}) 

ように私の@NgModuleを配線し、私のコンポーネントで私はこのような2つのサービスのいずれか1つの使用をする必要があります。

@component() 
export class AnimalComponent implements OnInit { 

    animalSound: string; 

    constructor(animalService: AnimalServiceInferface) { 
    } 

    onInit() { 
     this.animalSound = animalService.makeSound(); 
    } 

} 

私のアプリケーションは、両方のAnimalServiceInferfaceの実装を使用することができますが、使用される実装は、状況によって決定されるように、どのように私はこれを配線します。例えば、これは、特定のルートまたは異なるコンポーネント構成に基づいて決定することができる。

感謝

JT

答えて

2

CatServiceまたはDogServiceが注入されている場合は、キー

providers: [ 
    { provide: 'AnimalService': useClass: CatService}, 
    // { provide: 'AnimalService': useClass: DogService} 
], 
constructor(@Inject('AnimalService') animalService: AnimalServiceInferface) { 

として文字列またはOpaqueTokenを使用することができ、あなたがそれらを提供する場所によって異なります。ルーティングされたコンポーネントにプロバイダが登録されている場合、その子孫はこのインスタンスを取得します。一致しない場合、DIは一致するキーを持つプロバイダを見つけて、見つかった最初のプロバイダのインスタンスを返すまで上向きに検索します。

+0

ありがとうございました。ただし、同じコンポーネントを使用する2つの別個のルートが1つのルートでCatServiceを使用し、もう1つのルートでDogServiceをどのように使用できるかは明確に説明されていません。これはできますか? –

+0

あなたはこのルートごとに制御することはできません(少なくとも私は現在の方法を考えることはできません)が、あなたのケースでは動作するかもしれないし、動作しないかもしれない親コンポーネント毎にこれを制御することができます。プロバイダはコンポーネント(「プロバイダ」に追加されたとき)でハードコードされ、その子孫のすべてがそれ自身の「プロバイダ」リストでこれを上書きしない限り、このプロバイダからインスタンスを取得します。 –

+0

ありがとうございます。だから、このアイディアの本当の力は失われているようです。私が見ることができる唯一の作業は、メインコンポーネントをサブクラス化する(空の)コンポーネントを作成することです。 uurrghhh ....理想的ではない。 –