Кинжал 2 - модули из разных компонентов
Я не совсем уверен, как решить это с помощью кинжала 2.
Предположим, что мы имеем ApplicationModule
, что дает нам ApplicationContext
то мы имеем 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 от Jake, мне пришлось пропустить это, независимо от того, что я хочу использовать из другого модуля компонентов я должны предоставить в этом компоненте, например, я хочу использовать Context из ApplicationModule
, а затем внутри ApplicationComponent
Я должен указать Context provideContext();
, и он будет доступен. Довольно круто:)
Ответы
Ответ 1
Вы уже ответили на свой вопрос, но ответ заключается в том, чтобы указать методы предоставления в вашем "суперкопированном" компоненте (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();
}