2015-01-20 17 views
14

Ich bin mir nicht ganz sicher, wie dies mit Dolch zu lösen 2. Lets wir ApplicationModule annehmen, die uns ApplicationContext liefert dann haben wir ApplicationComponent, die nur dieses eine Modul verwendet. Dann oben haben wir ActivityModule und ActivityComponent, die Abhängigkeit von ApplicationComponent hat. ActivityComponent ist wieDagger 2 - Module aus verschiedenen Komponenten

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

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

bauen Und dann spritze ich meine Tätigkeit:

mComponent.inject(this); 

Jetzt zugreifen Ich bin in der Lage, alles zu verwenden, aber in meinem ActivityModule deklariert ist es für mich nicht möglich ist, ApplicationModule.

Die Frage ist also, wie das erreicht werden könnte? Also, wenn ich eine Komponente baue, die von einer anderen Komponente abhängt, kann ich immer noch von der ersten auf das Modul zugreifen?

EDIT

Ich glaube, ich Lösungen gefunden, nach Devoxx talk by Jake wieder rewatching ich, dass aus verpassen musste, was ich von einem anderen Komponente-Modul verwenden mag ich in dieser Komponente zur Verfügung zu stellen, zum Beispiel mag ich Kontext von ApplicationModule verwenden dann innerhalb ApplicationComponent Ich muss Context provideContext(); angeben und es wird verfügbar sein. Ziemlich cool :)

+0

Möchten Sie den Link zu dem Gespräch etwas ausmachen, veröffentlichen? Danke – Leonardo

+1

Hier sind Sie https://parleys.com/play/5471cdd1e4b065ebcfa1d557 – user3274539

+1

Sie sollten Ihre Bearbeitung als die Antwort posten und wählen Sie es aus. Nebenbei bemerkt, habt ihr in Dagger 2 Scopes herausgefunden? http://stackoverflow.com/questions/28411352/what-determines-the-lifecycle-of-a-component-object-graph-in-dagger-2 – Enrico

Antwort

15

Sie haben Ihre Frage bereits beantwortet, aber die Antwort ist, die Bereitstellungsmethoden in Ihrer "superscoped" Komponente (ApplicationComponent) anzugeben.

Zum Beispiel

@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

Müssen Sie' erweitert ApplicationComponent'? – mbmc

+0

@mbmc du tust das, um die Provisionsmethoden zu erben (was 'Something something();' ist) - wenn du nicht erben wirst, dann denke ich, dass du die 'ActivityComponent' nicht subscopen kannst, wenn du es jemals brauchst es. – EpicPandaForce

+2

Scheint, dass das Festlegen der Abhängigkeit ausreicht, um auf die Bereitstellungsmethoden von der übergeordneten Komponente zuzugreifen. – mbmc

Verwandte Themen