web-dev-qa-db-ja.com

ダガー2-異なるコンポーネントのモジュール

短剣2でこれを解決する方法がよくわかりません。ApplicationModuleを提供するApplicationContextがあるとすると、この1つのモジュールだけを使用するApplicationComponentがあります。その上に、ActivityModuleActivityComponentに依存するApplicationComponentがあります。 ActivityComponentは次のようにビルドされます

_    ApplicationComponent component = ((MyApplication) getApplication()).getComponent();

    mComponent = Dagger_ActivityComponent.builder()
            .applicationComponent(component)
            .activityModule(new ActivityModule(this))
            .build();
_

そして、私は自分の活動を注入します:

_mComponent.inject(this);
_

これで、ActivityModule内で宣言されているすべてのものを使用できるようになりましたが、ApplicationModuleにアクセスすることはできません。

では、問題はそれをどのように達成できるかということです。別のコンポーネントに依存するコンポーネントを構築するときに、最初のコンポーネントからモジュールにアクセスできるようにするには?

編集

私は解決策を見つけたと思います ジェイクによるDevoxxトーク もう一度、私はそのコンポーネントで提供しなければならない別のコンポーネントモジュールから使用したいものは何でも、それを見逃さなければなりませんでした、例えば私ApplicationModuleからContextを使用したい場合はApplicationComponent内でContext provideContext();を指定する必要があります。かなりクール :)

15
user3274539

すでに質問に回答していますが、回答は「スーパースコープ」コンポーネント(ApplicationComponent)でプロビジョニングメソッドを指定することです。

例えば、

@Module
public class ApplicationModule {
    @Provides
    @Singleton
    public Something something() {
        return new Something.Builder().configure().build(); 
           // if Something can be made with constructor, 
           // use @Singleton on the class and @Inject on the constructor
           // and then the module is not needed
    }
}

@Singleton
@Component(modules={ApplicationModule.class})
public interface ApplicationComponent {
    Something something(); //PROVISION METHOD. YOU NEED THIS.
}

@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface ActivityScope {
}

@ActivityScope
public class OtherThing {
    private final Something something;

    @Inject
    public OtherThing(Something something) {
        this.something = something;
    }
}

@Component(dependencies = {ApplicationComponent.class})
@ActivityScope
public interface ActivityComponent extends ApplicationComponent { //inherit provision methods
    OtherThing otherThing();
}
15
EpicPandaForce