0

私はインターフェースを持っています

public interface SomeInterface { 
  void test(); 
}

SomeInterfaceと呼ばれるの実装を生成する注釈プロセッサSomeInterfaceImpl

このタイプを Dagger 依存性注入で使用できるようにするには、次のように作成します。

@Component(modules = {ApplicationModule.class})
@Singleton
public interface ApplicationComponent {    
    SomeInterface getSomeInterface();       
}

@Module
public class ApplicationModule {

    @Provides
    @Singleton
    SomeInterface provideSomeInterface() {
        return new SomeInterfaceImpl();
    }
}

問題は、ApplicationModule で use を使用できないことSomeInterfaceImplです。それはまだ利用できず、アノテーション プロセッサによって生成されるためです。

SomeInterfaceDagger 依存性注入に使用できるように注釈プロセッサを拡張し、生成された実装SomeInterfaceImplが正しく解決されるようにするにはどうすればよいですか?

編集:

この例は機能しますが、別の注釈プロセッサを使用して ApplicationModule を作成し、プロセッサに ApplicationModule を何らかの方法でダガー グラフに統合させたいと考えています。@Component(modules={ApplicationModule.class}) ApplicationModule が生成されることをコードで知らないため、存在しません。生成された @Module クラスを Dagger Graph に統合する方法はありますか? ABCModule が生成されて @Component に追加されると推測したくないことに注意してください。これがどういうわけか自動的に起こることを望みます。

4

1 に答える 1

0

アノテーションが両方とも同じ javac 呼び出しにある限り、また最終的にプロセッサ ラウンドの 1 つでクラスを生成する限り、Dagger は後のラウンドまでシンボルの使用を延期する必要があります。

ただし、上記の特定の状況では、Dagger のプロセッサはSomeInterfaceImpl直接アクセスしようとさえしません。これは、それが@Providesメソッドの本体内にあり、注釈プロセッサが (パブリック API を介して) メソッド本体のコンテンツにアクセスできないためです。したがって、Dagger は が時間内に生成されるかどうかさえ気にする必要SomeInterfaceImplはありません。ただし、最後のラウンドの前に生成しないと、Dagger が生成するコードがコンパイルされない可能性があります (モジュール自体もコンパイルされません)。

于 2015-04-09T03:17:03.417 に答える