2016-04-06 10 views
2

私は依存関係を注入するためにguiceを使用しています。guiceプロバイダでguice injectorを使用する方法は?

私はこのプロバイダを持っている:それは、プロバイダでいたときに

public class RequestUrlRepository implements Provider<IRequestUrlRepository> { 


    @Singleton 
    @Override 
    public IRequestUrlRepository get() { 
     IRequestUrlRepository answer = null; 
     if (System.getProperty("").equals(RouteOrCostRequest.cost.toString())){ 
      answer = new CostRequestUrlRepository(...); 
     } 
     else 
     { 
      answer = new RoutingRequestUrlRepository(...); 
     } 
      return answer; 
    } 
} 

は、どのように私はnew CostRequestUrlRepository(...);new RoutingRequestUrlRepository(...)を埋めるためにGuiceのインジェクタを使用することができますか?

できない場合は、手動ですべてのctorのパラメータを作成せずにどのように初期化できますか?

答えて

3

プロバイダは@Inject -annotatedコンストラクタ、およびフィールドを受け入れ、Guiceの内蔵のバインディングあなたはInjectorとインジェクタ(例えばProvider<CostRequestUrlRepository>)を提供することができ、任意のキーのためのプロバイダの両方を注入できるようになることができます。 @Singleton注釈は、クラス、メソッドではないに行くこと

@Singleton 
public class RequestUrlRepository implements Provider<IRequestUrlRepository> { 

    @Inject Provider<CostRequestUrlRepository> costRepositoryProvider; 
    @Inject Provider<RoutingRequestUrlRepository> routingRepositoryProvider; 
    @Inject Injector injector; 

    @Override public IRequestUrlRepository get() { 
     IRequestUrlRepository answer = null; 
     if (System.getProperty("").equals(RouteOrCostRequest.cost.toString())){ 
      return costRepositoryProvider.get(); 
     } else { 
      return routingRepositoryProvider.get(); 
     } 

     // Alternatively: 
     return injector.getInstance(Class.forName(System.getProperty(""))); 
    } 
} 

注意。 Guiceのメーリングリストごとに「スコープの注釈はプロバイダー全体に適用され、@ Singletonでget()メソッドに注釈を付けることは誤りで無視されます。」 (link)。

理想的には、インジェクタ全体を注入するのではなく、各プロバイダを注入する必要があります。これにより、システムの依存関係を見やすくすることができます。そして、GuiceやJSR330の一般的なアノテーションには依存しません。しかし、変数内の名前やクラスのリテラルに基づいて任意のクラスをインスタンス化する必要がある場合は、インジェクタを注入する方法があります。

+0

私は 'costRepository'と' routingRepository'を初期化して、 'IRequestUrlRepository'インターフェースを満たすと思っています。私はプロバイダをそれぞれに書くべきだとは思わない –

+0

'X'、' Provider '、' @Provides X'へのバインディングの場合、Guiceは自動的にプロバイダを作成するか 'provider.get()'を自動的に呼び出します。リポジトリ用に独自のプロバイダを作成する必要はありません。 –

関連する問題