2016-07-13 5 views
1

私はダガー2に、この単純なクラスを持っている:注入が完了した直後にコードを実行できますか?

@Inject public Bus bus; 

@Inject 
public TwitterAppModel() { 
    bus.register(this); 
} 

busは、コンストラクタ関数でnullあるので、これは動作しません。注入が完了し、busがヌルでないときに何らかの形で(例えば注釈などで)傍受することはできますか?

@Inject 
public TwitterAppModel(Bus bus) { 
    this.bus = bus; 
} 

そして、私のモジュールに:私は次の操作を行う場合

それは動作します:私はこのソリューションのように本当にいけない

@Provides 
@Singleton 
TwitterAppModel provideTwitterAppModel(Bus bus) { 
    return new TwitterAppModel(bus); 
} 

、それは作る私が試した何

リファクタリングはより難しく、注射の順序は気にしません。他のIOCフレームワークには、注入が完了したときにコードを実行するために使用できるイベント/注釈がありました。

私のようなものを探しています

:これはコンフィグクラス(ダガーはすでに十分に持っている)で以下のコードを持って、コードをより明確になるだろう、私が望んでいた場合、このクラスは、取り外しが容易になり

@Inject public Bus bus; 

@Inject 
public TwitterAppModel() { 
} 

@OnIjectComplete 
public void onInit() { 
    bus.register(this); 
} 

起動時に使用したい新しい@Injectを2つの場所などで編集する必要はありません。

+0

いくつかのガイドとチュートリアルを読んで、具体的な質問をしてみてください。これは、あなたがダガーが何であるか、それがどのように機能するかを理解しようとしなかったように見えます。あなたは間違ったコンストラクタを使用していて、ちょうどあなたが魔法が起こることを期待しているかのようにいくつかの@Injectを散らしています。 –

+0

@DavidMedenjak申し訳ありません、私はダガーの専門家ではありません。私はStackOverflowが人々が何かを知らないとお互いを侮辱するのではなく、質問したり答えたりするサイトでした。私はDaggerがどのように機能するかを私が知っていることを示すために質問を編集しました。 – sydd

+0

私は侮辱するつもりはありませんでした。今質問を編集した後、より良い問題文があります。しかし、コンストラクタインジェクションとモジュールの混合はまだ進んでいます。あなたはダガーを使って 'new'呼び出しを書く必要はありません。ちょうどいくつかのエッジケースでは、知っていますか?そして、あなたのフィールドに注釈をつけ、フィールドインジェクションを使うか、コンストラクタインジェクションを使うためにあなたのコンストラクタに注釈をつけてください。 –

答えて

1

探している@OnInjectComplete注釈は既に存在します。それは@インジェクションと呼ばれています! @Injectフィールドが設定された後、@Injectを持つメソッドが呼び出されます。メソッドがパラメータを受け取ると、それらのパラメータが注入されます。

ので、試してみてください。

@Inject public Bus bus; 

@Inject 
public TwitterAppModel() { 
} 

@Inject 
public void onInit() { 
    bus.register(this); 
} 
関連する問題