2017-07-20 7 views
1

Angularでは、私はconstructor(...)を通して注入されるものがほとんどないサービスを持っています。しかし、そのサービスはコンストラクタを呼び出すことによっていくつかの場所にも作成されます。したがって、パラメータに依存する別のサービスを追加すると、APIが変更されます。私はそれを避けたいです。角度 - コンストラクタとは別の方法で注入するか?

サービスをコンストラクタパラメータに追加せずに別のサービスに挿入する方法はありますか?例えば。フィールドインジェクション?

import {Inject, Injectable} from "@angular/core"; 
import { 
    Http, Request, ConnectionBackend, RequestOptions, RequestOptionsArgs, Response, Headers, 
    RequestMethod 
} from "@angular/http"; 

import {KeycloakService} from "./keycloak.service"; 
import {Observable} from 'rxjs/Observable'; 
import {EventBusService} from "../events/event-bus.service"; 
import {LoadingSomethingFinishedEvent, LoadingSomethingStartedEvent} from "../events/windup-event"; 

@Injectable() 
export class WindupHttpService extends Http { 
    constructor(
     _backend: ConnectionBackend, 
     _defaultOptions: RequestOptions, 
     private _keycloakService: KeycloakService, 
     // ----- This is what I want to avoid. ----- 
     private _eventBus: EventBusService, 
    ) { 
     super(_backend, _defaultOptions); 
    } 

    // ------- This is what I am looking for --------- 
    //@Inject() 
    //private _eventBus: EventBusService; 
+1

https://stackoverflow.com/help/mcveを入力してください。あなたのケースが何であるかは明確ではなく、実際のコードに依存します。 – estus

+0

あなたが達成しようとしていることを示すコードを追加してください。あなたの説明はあいまいです。 –

+0

あなたのアップデートに基づいて、短い答えは:いいえ、AngularのDIはネイティブにコンストラクタ注入をサポートします。 – jonrsharpe

答えて

3

はい、いいえ。

あなたはInjectorを使用することができますが、最良の方法は、サービスにそれを注入することである。

インジェクターについて
constructor(private injector: Injector) { 
     let httpService: Http = this.injector.get(Http); 
} 

詳細はここで見つけることができます:ここで https://angular.io/api/core/Injector

はまた、使用可能なリンクであり、 @ DBosleyは:https://angular.io/guide/dependency-injection#appendix-working-with-injectors-directly

+1

ここにいくつかの良い例があります:https://angular.io/guide/dependency-injection#appendix-working-with-injectors-directly – DBosley

+0

@Dbosleyこのリンクをありがとう:) –

3

factory providersを使用してAngularのDI内で行うことができます。

ここで FieldInjectedService
injectFields(dependency: SomeDependency) { 
    let service = new FieldInjectedService(); 
    service.dependency = dependency; 
    return service; 
} 

... 

providers: [ 
    { provide: FieldInjectedService, useFactory: injectFields, deps: [SomeDependency] }, 
    ... 
] 

0は、任意のコンストラクタのパラメータはありませんが、そのdependencyプロパティは、任意の使用に設定されている必要があります。欠点はもちろん、にはというフィールドを設定する必要がないため、サービスの無効なインスタンスを簡単に作成できることです。

関連する問題