短剣2でこれを解決する方法がよくわかりません。ApplicationModule
を提供するApplicationContext
があるとすると、この1つのモジュールだけを使用するApplicationComponent
があります。その上に、ActivityModule
とActivityComponent
に依存する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();
を指定する必要があります。かなりクール :)
すでに質問に回答していますが、回答は「スーパースコープ」コンポーネント(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();
}