web-dev-qa-db-ja.com

コンポーネントの依存関係を使用する際のシングルトンの問題

次のコードが機能しない理由を理解するのに問題があります。

私は次のプロジェクト構造を持っています:

@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つのコンポーネントが他のコンポーネントからバインディングを継承して、オブジェクト(シングルトン)への同じ参照を持つことです。

49
Cativail

@Singletonto 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 で議論されましたが、まだ変更される可能性があります。

111

追加する

@Singleton
@Component(modules = {NameModule.class})
public interface NameComponent {

}

dagger2ではスコープモジュールでスコープ外のコンポーネントを使用できないため、コンポーネントに対して

5
sonal balekai

最新のDagger-2リリースのバグのように見えます: https://github.com/google/dagger/issues/107

0