2016-03-02 6 views
6

私は1つのサービスの複数のインスタンスを使用する必要があります。サービスでプロバイダを使用するには?

私はコンポーネントで、このサービスの1つのインスタンスを使用する場合通常、私はこのように書く:

@Component({ 
    selector: 'one-component', 
    providers: [provide("token1", {useClass: Service})], 
    template: ` 
     <h1>App</h1> 
    ` 
}) 
export class OneComponent { 
    constructor(@Inject('token1') service:Service) {} 
} 

しかし、今、私はこのように書き、サービス2にこのサービスを使用する必要があります。

export class Service2 { 
    constructor(@Inject('token1') service:Service) {} 
} 

ご存知のように、それは示しています

ませプロバイダを

Service2のでproviders: [provide("token1", {useClass: Service})]を持っていません。しかし、@Componentがないため、どこに追加できますか?

+0

? – Ludohen

+0

助けてくれてありがとう@Ludohen、私はコンポーネントでService2を使います。 –

+0

あなたがしようとしていることは間違いなく可能です。 – Ludohen

答えて

2

悲しいことに、この方法は、現在サポートされておらず、現在、私はギュンターの答えはここに完全に正しいとは思わないサポートhttps://github.com/angular/angular/issues/5622

+0

私に知らせてくれてありがとう! –

0

を追加する予定はありませんサービスを構成

感謝。 私がHongbo Miaoの問題を正しく理解していれば、これは「簡単に」達成することができます。 すべての注入でサービスの新しいインスタンスを取得したい場合は、useClassプロバイダ設定の代わりにuseFactoryを使用する必要があります。 Service2が注入され、あなたがService2"token1"には、プロバイダのエラーを取得していない場合、それは右のインジェクタ、兄弟やOneComponentの親に設定していないので、それはだ

...。

編集:

これが機能するためにあなたが(例えば)ルートコンポーネントであなたのServiceService2プロバイダを定義する必要があります。この場合、すべてが同じサービスのインスタンスを共有します。

あなたは、各コンポーネントの異なるインスタンスを持つようにしたい場合は、サービスが使用されているコンポーネント・レベルでプロバイダを定義します。 @Inject('StringToken')を使用して

@Component({ 
    providers: [Service, Service2], 
    // Other config props 
}) 
export class RootComponent { 
} 

@Component({ 
    // Config props 
}) 
export class OneComponent { 
    constructor(public service: Service) {} 
    methodx() { 
    this.service... 
    } 
} 

@Component({ 
    // Config props 
}) 
export class TwoComponent { 
    constructor(public service: Service2) {} 
    methodx() { 
    this.service... 
    } 
} 

@Injectable() 
export class Service2 { 
    constructor(public service: Service) { 
    } 
} 

は、あなたが最高のものではなく、推奨される方法ではありません。代わりにTypeトークンを使用してください(上記のコードのように)。

資源:私はapp.module.tsのプロバイダの配列内の2つのサービスを宣言することによって(サービスAにサービスBを使用して)このエラーを修正しました

+0

ありがとう、私はすぐに小切手を持っています! –

+0

あなたのコードと私が望むものに基づいて、私は 'Service'を使う' ThreeComponent'をもう一つ持っています。 'OneComponent'と' ThreeComponent'が 'Service'の異なるインスタンスを使いたがります。だから、「サービス」を使うときにトークンを追加するのです。それで 'Service2'では' Service'に 'provider'を使う方法がありません。 –

+0

'Service2'は特別なものを必要とせず、プロバイダは上記のインジェクタツリーで定義されています – Ludohen

0

。あなたは、あなたのサービス2を使用しない

@NgModule({ 
    declarations: [...], 
    imports:  [...], 
    providers: [ 
     ServiceA, 
     ServiceB, 
    ], 
    bootstrap: [...], 
}) 
関連する問題