2015-01-20 3 views
14

Я не совсем уверен, как решить эту проблему с кинжалом 2. Давайте предположим, что мы имеем ApplicationModule, что дает нам ApplicationContext то мы имеем ApplicationComponent, который использует только этот модуль. Затем поверх него мы имеем ActivityModule и ActivityComponent, который имеет зависимость от ApplicationComponent. ActivityComponent построен так же, какDagger 2 - модули из различных компонентов

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

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

А потом я впрыснуть свою деятельность:

mComponent.inject(this); 

Теперь я могу использовать все, что объявленную внутри моей ActivityModule, однако это не представляется возможным для меня доступ ApplicationModule.

Итак, вопрос в том, как это можно достичь? Так что, когда я создаю компонент, который зависит от другого компонента, я все еще могу получить доступ к модулю из первого?

EDIT

Я думаю, я нашел решение, после rewatching Devoxx talk by Jake снова, мне пришлось пропустить, что из, что я хочу использовать из другого модуля компонентов, я должен обеспечить в этом компоненте, например, я хочу использовать контекст от ApplicationModule, затем внутри ApplicationComponent Должен быть указан Context provideContext();, и он будет доступен. Довольно круто :)

+0

Вы не могли бы разместить ссылку на разговор? Спасибо – Leonardo

+1

Здесь вы https://parleys.com/play/5471cdd1e4b065ebcfa1d557 – user3274539

+1

Вы должны опубликовать свое редактирование в качестве ответа и выбрать его. На боковой ноте, вы разобрали области в кинжале 2? http://stackoverflow.com/questions/28411352/what-determines-the-lifecycle-of-a-component-object-graph-in-dagger-2 – Enrico

ответ

15

Вы уже ответили на свой вопрос, но ответ заключается в том, чтобы указать методы предоставления в вашем «суперкопированном» компоненте (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(); 
} 
+0

Вам нужно« расширять ApplicationComponent »? – mbmc

+0

@mbmc вы делаете это, чтобы наследовать методы обеспечения (что-то «что-то что-то»();) - если вы не наследуете, то я думаю, что вы не сможете подкачать «ActivityComponent», если вам когда-нибудь понадобится Это. – EpicPandaForce

+2

Кажется, что установить зависимость достаточно для доступа к методам предоставления из родительского компонента. – mbmc

Смежные вопросы