2009-08-03 22 views
11

同じ基本タイプのシングルトンインスタンスを2つ取得できますか?同じタイプのguiceシングルトンを複数取得する場合は、

これはスコープを付けた名前付きインスタンスに基づいているため、明らかに些細なことですが、実装クラスに型をバインドするguiceでは同等のことがわかりません。問題のインスタンスはguiceによって他の依存関係が注入されるため、インスタンスにバインドする必要はありません。

答えて

15

Guiceでも簡単です! 2つの結着注釈を作成し、私はあなたがtoInstance()を使用して自分自身を制限する必要がないことを追加することで、マルチンの応答を補完したい@One@Two、その後

bind(MySingleton.class).annotatedWith(One.class).toInstance(new MySingleton()); 
bind(MySingleton.class).annotatedWith(Two.class).toInstance(new MySingleton()); 

、その後

@Inject 
public SomethingThatDependsOnSingletons(@One MySingleton s1, 
    @Two MySingleton t2) { ... } 
+0

または@Providesメソッドに依存関係がある場合は、私はこのドキュメントを見逃していました(http://code.google.com/docreader/#p=google-guice&s=google-guice&t=ProvidesMethods) 依存関係はありますかメソッドにパラメータとして渡すことができます。インジェクタはメソッドを呼び出す前に、それぞれのバインディングを実行します。 – Matt

+0

インスタンスにバインドする必要はありません。スコープシングルトン内の同じクラスに対する2つの異なる注釈は、既に2つの別々のインスタンスを作成します。 –

+2

@Filip、私はあなたが示唆しているものを試して、両方の注釈に対して同じインスタンスを受け取った。私は 'bind(MySingleton.class).annotatedWith(One.class).to(MySingleton.class).in(Singleton.class);を使用しました。 bind(MySingleton.class).annotatedWith(Two.class).to(MySingleton.class).in(Singleton.class); ' –

13

を言いますまたはそのような状況のプロバイダーメソッド。

以下は、同じようにうまく動作します:

bind(Person.class).annotatedWith(Driver.class).to(MartyMcFly.class).in(Singleton.class); 
bind(Person.class).annotatedWith(Inventor.class).to(DocBrown.class).in(Singleton.class); 

[...]

@Inject 
public BackToTheFuture(@Driver Person marty, @Inventor Person doc) { ... } 
マーティ・マクフライとDocBrownのクラスをインスタンス化する際

Guiceのは、いつものように依存関係を注入します。


それはまた、あなたが同じタイプの複数のシングルトンバインドしたいときに動作することを注意:これが機能する

bind(Person.class).annotatedWith(Driver.class).to(Person.class).in(Singleton.class); 
bind(Person.class).annotatedWith(Inventor.class).to(Person.class).in(Singleton.class); 

を、あなたはPersonはシングルトンにバインドされていないことを確認する必要がありますスコープは、Guiceモジュールに明示的に、または@Singletonアノテーションで指定します。詳細はthis Gistです。

編集: サンプルコードはGuice Grapher Testです。 Guiceテストを見ることは、APIの使い方をよりよく理解するための優れた方法です(単体テストの良いすべてのプロジェクトに適用されます)。

+1

私はこの例が大好きです –

+0

ありがとうございましたJesse :)実際に私のポイントを説明するために使用したサンプルコードGuice Grapher拡張のテストから来ています。私はそれが面白いと思って、それをそのまま貼り付けました。私はソースにリンクを張っておくべきだったが(私は今それをやる)。私はあなたのブログ、特にGuice/Google Collections(http://publicobject.com/)に関するあなたの実用的な記事を愛しています。あなたのようなブログがもっと必要です。だから、これもありがとう。 –

+0

@eneveu、あなたはあなたの解決策がMarcin'sの代わりであることをお勧めします。 1つのコンクリート(Driver)クラスの2つのインスタンスに対して、2つの異なるドライバ実装クラス(MartyMcFly、DocBrown)があると仮定しているため、あなたが記述したユースケースは彼自身とは異なります。後者の場合にこの手法を使用しようとすると、これを使って同じシングルトンへの参照が2つ取得されます。 ); bind(MySingleton.class).annotatedWith(Two.class).to(MySingleton.class).in(Singleton.class); ' –

関連する問題