Кинжал 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();
}