2017-12-15 23 views
1

によって作成オブジェクトは、クラスParserの(派生クラスの)オブジェクト(xyそれらを呼び出す)の両方を作成するためにcreate_x()create_y()私は2つの類似(しかし異なる)メソッド(または多分静的メソッド)を持っていると仮定します。Guiceの:方法

bind(Parser.class) 
     .annotatedWith(Names.named("x")) 
     .to(ParserXImplementation.class); 

bind(Parser.class) 
     .annotatedWith(Names.named("y")) 
     .to(ParserYImplementation.class); 

が、クラスParserXImplementationParserYImplementationcreate_x()create_y()代わりのインスタンスによって作成されたオブジェクトを持つ:

今、私はanswer to my previous questionのようにのように、これらの2つの方法で作成されたオブジェクトをバインドします。 (したがって、クラスを作成する必要はありません。ParserXImplementationParserYImplementation

オブジェクトをシングルトンにします。

,create_y()が静的​​メソッドである場合と、インスタンスメソッドである場合の両方の回答が必要です。それらがインスタンスメソッドである場合、それらを含むクラス自体が依存関係注入の対象となる可能性があります。

これを行う方法? https://github.com/google/guice/wiki/ProvidesMethodsから

答えて

0

を(メソッドによって作成されたインスタンスへの依存関係を注入):

オブジェクトを作成するためのコードが必要な場合、@Providesメソッドを使用します。メソッドはモジュール内で定義する必要があり、@Providesアノテーションが必要です。メソッドの戻り値の型はバインドされた型です。インジェクタがその型のインスタンスを必要とするときはいつでも、それはメソッドを呼び出すでしょう。

public class BillingModule extends AbstractModule { 
    @Override 
    protected void configure() { 
    ... 
    } 

    @Provides 
    TransactionLog provideTransactionLog() { 
    DatabaseTransactionLog transactionLog = new DatabaseTransactionLog(); 
    transactionLog.setJdbcUrl("jdbc:mysql://localhost/pizza"); 
    transactionLog.setThreadPoolSize(30); 
    return transactionLog; 
    } 
} 

さらに、それはBinding the same interface twice (Guice)に答えで説明したように、それはxyを区別するために@Named("x")@Named("y")のようなアノテーションを使用できることを述べています。

これは私が必要です(ただし、メソッドは任意のクラスではなくモジュール内で定義されています)。

関連する問題