2016-10-21 3 views
0

私はguice MapBinderは注入のためのバインディングキーを公開していますか?

class Fruit extends FruitBase { 
    @Inject Fruit(Type type) {...} 
} 

クラスフルーツがあるとフルーツもGuiceのを通して注入されなければならないのでFruitBaseは、方法の注射を介していくつかのものを注入します。

今私は別のクラスにMap<Type, Fruit>を注入する必要があります。そこで私はMapBinderを作成します。一番簡単な方法は、各タイプの果実のいくつかのサブクラスを作成することです:

class Orange extends Fruit { 
    @Inject Orange() { 
    super(Type.ORANGE); 
    } 
} 

// and later 
mapBinder.addBinding(Type.ORANGE).to(Orange.class); 

しかし、私は、単純なサブクラスの束を作成して、代わりにMapBinderは、私が(に結合していたラベルを注入したくない場合はType.ORANGE,Type.APPLE)を果物そのものに入れますか?

mapBinder.addBinding(Type.ORANGE).to(Fruit.class); 
mapBinder.addBinding(Type.APPLE).to(Fruit.class); 

をして、私の注入された地図は、フルーツの2件のインスタンスがあります:だから私は持っているでしょうタイプORANGEと1、およびAPPLEのものを。

これは可能ですか?

私はここ1つの回避策が見つかりました:https://groups.google.com/d/msg/google-guice/m-m9LiVsgSM/pKVi2EIILCsJ

しかしfactories.get(type).create(type);はただちょっとにおいがします。

答えて

2

事前作成インスタンスにバインドを使用できます。この場合、これらのインスタンスのインジェクタではなく、のメンバによって作成されたインスタンスは、後でインジェクトされます。

mapBinder.addBinding(Type.ORANGE).toInstance(new Fruit(Type.ORANGE)); 
mapBinder.addBinding(Type.APPLE).toInstance(new Fruit(Type.APPLE)); 

同じインスタンスがいくつかの注入マップで共有されるため、問題が発生する可能性があります。

+0

興味深いことに、私はそれを確認する必要があります! –

+0

ドキュメントには、多かれ少なかれすべてを説明する包括的な例があります。http://google.github.io/guice/api-docs/latest/javadoc/com/google/inject/multibindings/MapBinder.html –

関連する問題