2011-12-07 9 views
1

私は2つのRunnableクラスを持っています。SecondProcedureFirstProcedureで作成されたTableを使って実行されるように、それらの間に依存関係を注入したいと思います。注釈を使ったGuiceメソッドの注入

class FirstProcedure implements Runnable { 
    private Table composers = new Table(); 

    public void run() { 
     // populates the composers table 
    } 

    public Table getComposers() { 
     return composers; 
    } 
} 


class SecondProcedure implements Runnable { 
    private Table composers; 

    public void run() { 
     // writes the name of each composer to the console 
    } 

    public Table setComposers(final Table composers) { 
     this.composers = composers; 
    } 
} 

アイデアは私のメインのクラスで、私は、(それはこの時点で読み込まれることはありませんにもかかわらず、正しく参照する必要があります)、関連するテーブルを注入し、手順の両方をインスタンス間の依存関係をうまくできるということです2つの手順を実行し、正しい順序で実行します。つまり、これらの2つのプロシージャのそれぞれに固有のインスタンスが存在します(ただし、私は意図的にSingleton(anti)パターンを避けて、適切な単体テストを行うことができます)。

Guiceを使ってどうすればいいですか? は、私のようなものでsetComposersメソッドに注釈を付けることができます:

@InjectTable(procedure=FirstProcedure.class, name="composers") 
public Table setComposers(final Table composers) { 
    this.composers = composers; 
} 

と表示されたフィールドのクラスと名前に基づいてSecondProcedureTableを結合するGuiceのモジュールがありますか?

bind()の方法では、このパラダイムに非常に合ったものは表示されません。AbstractModuleです。

(これとは別に、私が代わりに明示的に何とか方法を参照する、フィールドの名前が文字列であることと、この注釈自体の設計にあまりにも熱心ではないよ。)

答えて

0

私は思います問題が複雑すぎるかもしれません。

SecondProcedureがテーブルの上にシンプルな依存関係があるように見えます:

class SecondProcedure { 
    @Inject 
    SecondProcedure(Table table) { 
    this.table = table; 
    } 
} 

をそしてFirstProcedureは、表のプロバイダである:

class FirstProcedure implements Provider<Table> { 
    public Table get() { 
    return buildTheTable(); 
    } 
} 

あなたのモジュールは、その後だけでプロバイダをバインドする必要があります。

class SomeModule extends AbstractModule { 
    protected void configure() { 
    bind(Table.class).toProvider(FirstProcedure.class); 
    } 
} 

@ InsertアノテートされたコンストラクタのJITバインディングは、SecondProcedureを提供します。それを明示的にバインドする必要はありません。

これを実行したら、FirstProcedureの名前をTableProviderに変更することを検討します。 FirstProcedureを使用するには

、あなたはその後、ちょうどそれを注入し、またはインジェクタからそれを得る:それはだとしてさておき、Guiceのシングルトンパターン(@Singletonスコープ)として

injector.getInstance(FirstProcedure.class).run(); 

は、アンチパターンではありませんインジェクタに閉じ込められている。それが適切であるケースがたくさんあり、Guiceのシングルトンの実装はテストの方法では得られません。

おそらく、あなたが気にするべきことは静的な状態です。 Guice自身がなぜ悪いのかをよく説明しています:http://code.google.com/p/google-guice/wiki/AvoidStaticState

関連する問題