2016-04-18 17 views
2

私はプロジェクトを持っています。私は自分のプロジェクトにインジェクトしたいIImplementMeと呼んでいます。このインターフェイスはさまざまなプロデューサによって実装されるため、すべての実装を注入する必要があります。私はこのためにTypeLiteralを使用しようとしています。私のプロジェクトで、私はこのようにそれを注入し、TypeLiteralを使用したJavaインジェクションの実装

@Singleton 
public class SomeImplementation implements IImplementMe { 

private final String value; 

@Inject 
public SomeImplementation(final SomeOtherConfig configuration) { 
    this.value= configuration.getValue(); 
} 

@Override 
public String getValue() { 
    return value; 
} 
} 

そして、私のレジストリクラスで、私はその後register(IImplementMe.class).to(SomeImplementation.class);

を持っている:ここで

は、プロデューサーのコードである

@Inject 
public SomeEndpoint(final List<IImplementMe> implementations){ 
/// 
} 

と私のように縛る

private static class MarketDataSetTypeLiteral extends TypeLiteral<List<IImplementMe>> { 
} 
bind(new MarketDataSetTypeLiteral()).toRegistry(); 

私のSomeIMplementationコンストラクタが呼び出されたことを確認しましたが、私のエンドポイントでListが空であるため、実装は提供されていません。私は注射のためにguiceを使用しています。何か案は ?

LE:エンドポイントクラスを作成した後(作成時に空のリストの参照を注入する)、提供された実装が作成されていることがわかります。ライフサイクルの後半ではリファレンスが実装されて更新されているので、実際にguiceがそれを実行した後にアクセスします。

私は、それがmavenの依存関係、guiceがインスタンス化をどのように処理しているのかと推測しています。プロデューサーは自分のプロジェクトに依存しなければならないので、最後にインスタンス化されるのは当然のことだと思います。

+0

'CustomTypeLiteral'(' MarketDataSetTypeLiteral'を意味しましたか?)や 'toRegistry'で何をしようとしているのか分かりません。一般に、[Multibindings](https://github.com/google/guice/wiki/Multibindings)と同様の機能を実行しようとしているようですが、自分のレジストリを使用しているようです。 'bind(...)toRegistry()'が何をすべきか、あるいはそれをどのように実装したかをもっと見せてくれますか? –

+0

はい、申し訳ありませんが、MarketDataSetTypeLiteralとなっています。レジストリの実装では、基本的にyarレジストリの実装です(リンク:https://github.com/javabits/yar/blob/master/yar-guice/src/main/java/org/javabits/yar/guice/RegistryAnnotatedBindingBuilderImpl .java)。 –

答えて

0

あなたがmultibindingsを探しています - >https://github.com/google/guice/wiki/Multibindings

public class IImplementMeModule extends AbstractModule { 
    public void configure() { 
    Multibinder<IImplementMe> uriBinder = Multibinder.newSetBinder(binder(), IImplementMe.class); 
    uriBinder.addBinding().to(SomeImplementationOfIImplementMe.class); 
    uriBinder.addBinding().to(AnotherImplementationOfIImplementMe.class); 

    ... // bind plugin dependencies, such as our Flickr API key 
    } 
} 

は、その後、あなたが可能にMapBindingsを見てする

@Inject TweetPrettifier(Set<IImplemetnMe> implementations) 

私はあなたを示唆しているが、以下のようIImplemetnMeのセットを注入することができます各実装にキーを提供すると、バインディングをマップとして注入することができます

+1

ありがとうミラノ、これは良い選択肢のように見える、見てみましょう:) –

関連する問題