次のコードが機能しない理由を理解するのに問題があります。
私は次のプロジェクト構造を持っています:
@Component(modules = CCModule.class)
public interface CComponent {
XXX getXXX();
}
どこで
@Module
public class CCModule {
@Provides @Singleton
public XXX provide XXX(){
return new XXX();
}
}
そして
@Component(dependencies = CComponent.class, modules = AAModule.class)
public interface AComponent {
YYY getYYY();
}
どこで
class YYY {
@Inject
public YYY(XXX xxx) {
...
}
}
すべてを次のように初期化します。
CComponent c_component = Dagger_CComponent.builder().cCModule(new CCModule()).build();
AComponent a_component = Dagger_AComponent.builder()
.cComponent(c_component)
.aAModule(new AAModule())
.build();
コンパイルが行われると、次のエラーが表示されます。
エラー:(11、1)エラー:com.test.CComponent(unscoped)はスコープバインディングを参照できません:@Provides @Singleton com.test.XXX com.test.CCModule.provideXXX()
私が目指しているのは、1つのコンポーネントが他のコンポーネントからバインディングを継承して、オブジェクト(シングルトン)への同じ参照を持つことです。
@Singleton
to CComponent
クラス宣言。
@Singleton
@Component(modules = CCModule.class)
public interface CComponent {
XXX getXXX();
}
説明はエラーメッセージにあります:CComponent
は対象範囲外です、@Singleton
はスコープです。 Dagger 2では、スコープ外のコンポーネントがスコープ付きバインディングでモジュールを使用することを許可していません。
ただし、次のエラーが表示されます。
AComponent (unscoped) cannot depend on scoped components:
@Component(dependencies = CComponent.class, modules = AModule.class)
スコープ外のコンポーネントには、スコープ依存関係を設定できません。したがって、AComponent
をスコープにする必要があります。これを行うには、カスタムAScope
アノテーションを作成します。
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface AScope {
}
そしてそれに注釈を付けますAComponent
:
@AScope
@Component(dependencies = CComponent.class, modules = AModule.class)
public interface AComponent {
}
これらは最新の snapshot release に登場した新しい要件です。それは対応する issue で議論されましたが、まだ変更される可能性があります。
追加する
@Singleton
@Component(modules = {NameModule.class})
public interface NameComponent {
}
dagger2ではスコープモジュールでスコープ外のコンポーネントを使用できないため、コンポーネントに対して
最新のDagger-2リリースのバグのように見えます: https://github.com/google/dagger/issues/107