2016-06-22 7 views
1

ルートインジェクタから既に作成されたインスタンスを確実に取得する方法はありますか?私のユースケースは、自分でタイプ(newの構造体)をインスタンス化する必要があるということですが、上記のタイプを設定する際に、2つのAngular2 Injector管理インスタンスを取得する必要があります。Angular2 - ルート/アプリインジェクタから既にキャッシュされたインスタンスを取得する

app: ApplicatinRef; 

上記のapp変数は、DI自体によって取得されます。私は上記のコードを使用すると

const rootInjector: Injector = app.injector; 
rootInjector.get(SomeInstance); 

SomeInstanceタイプを2回インスタンス化されると、私はブートストラップ中に作成された同じインスタンスを取得することを期待していました。

ドゥ・ノート、しかし、私が最初にそれを呼び出した後

rootInjector.get(SomeInstance); 

を複数回呼び出したとき、それは再びそれをインスタンス化しません。したがって、ブートストラップ処理中とインジェクタ自体を初めて呼び出すときの2回のインスタンス化のみです。

SomeInstanceの他のプロバイダはDI階層になく、ブートストラップ時にアプリケーションレベルでのみ指定されています。

何か不足していますか?

答えて

1

インジェクタをこのようにして取得する必要はありません。角度はすでにインジェクタを注入しています。他の場所に指定しない場合、インスタンスは階層内のすべてのコンポーネントと同じになります。あなたの主成分で提供している場合、このインスタンスがすべてで同じになります

... 
constructor(private serviceInstance : ServiceClassName){ 
    this.serviceInstance.doSomething(); 
} 

:また、あなたはこのように、コンストラクタであなたのサービスのインスタンスを求めることができ、直接注入器を使用する必要はありませんコンポーネント:

import { provide } from '@angular/core'; 
... 
bootstrap(..., provide(ServiceClassName, {useClass : ServiceClassName})); 

しかし、あなたはプロバイダの設定のparamaterを使用して、階層の任意の場所にこのインスタンスを追加することができます。このように提供

import { provide } from '@angular/core'; 
... 
@Component({ 
... 
providers : [provide(ServiceClassName, {useClass : ServiceClassName})] 
}) 

が作成されます。このコンポーネントとそのサブコンポーネントのインスタンスだけです。

+0

私はそのように理解しますが、そこには私の問題があります。私は、インスタンスを処理するためにDIコンテナに渡すことは絶対に望まないインスタンスを扱っています。私はそれを自分で作成する必要があります(完全なコントロールが必要です)が、私がコントロールするインスタンスの中には、Angular2 Injectorで管理される他のタイプのインスタンスが2つ必要です。だから型をインスタンス化するときに、インジェクタから他の2つのインスタンスを取得したいと思います。私はすでに回避策を実装していますが、私はAngular2 APIを直接調べて、自分のハックを実装できない、よりクリーンなものを望んでいました。 – 0v3rst33r

+1

Hum .. コードがどのくらい正確に機能するのかわかりませんが、工場でDIを使用することもできます。関数の中でインジェクタを使って角のインスタンスを取得し、自分でカスタムインスタンスを作成することができます。このような 何か: ストラップ(...、提供(ServiceClassName、{useFactory:()=> { /*インジェクタと特殊ロジック* /新しいServiceClassName(injectorInstance1、injectorInstance2、specialInstance)戻り ; を}})) ; –

+0

これはおそらく私が実験できるものです。私のコードがどのように機能するかについての私の質問に、より詳細な情報が追加されます。私は 'ListContainer'で構築する必要がある基本的に' User'ドメインオブジェクト(そのインスタンスはDIから決して出てこないでしょう)であり、DIシステムからのインスタンスを必要とするこれらのコンテナです。 – 0v3rst33r

関連する問題