2015-07-10 37 views
8

Ja, ich weiß, das wurde schon einmal gefragt, und ja, ich weiß, es ist "von Design".Dolch2: Komponente kann nicht von mehreren Bereichen abhängig sein

Aber ich möchte so etwas tun:

@Component(modules = {RealmModule.class}) 
public interface RealmComponent { 
    Realm realm(); 
} 


@Component(modules = {RepositoryModule.class}) 
public interface RepositoryComponent { 
    PersonRepository personRepository(); 

    ScheduleRepository schedulesRepository(); 
} 

@Component(dependencies = {RealmComponent.class, RepositoryComponent.class}) 
public interface AppDataComponent 
     extends RealmComponent, RepositoryComponent { 
} 

@ApplicationScope 
@Component(dependencies = {AppContextComponent.class, 
     AppDataComponent.class, 
     AppDomainComponent.class, 
     AppPresentationComponent.class, 
     AppUtilsComponent.class}) 
public interface ApplicationComponent 
     extends AppContextComponent, AppDataComponent, AppDomainComponent, AppUtilsComponent, AppPresentationComponent { 
    void inject(CustomApplication customApplication); 

    void inject(DashboardActivity dashboardActivity); 
} 

Doch was ich bekommen ist unscoped, ich jedes Mal, wenn ein JobManager oder ein ScheduleRepository oder irgendetwas anderes zu injizieren, bekomme ich eine neue Instanz. Der einzige Weg, wie ich "reparieren" konnte, war das.

@Module 
public class JobManagerModule { 
    private JobManager jobManager; 

    @Provides 
    public JobManager jobManager(Context context) { 
     if(jobManager == null) { 
      jobManager = new JobManager(context, new Configuration.Builder(context).networkUtil(
        new WifiOrMobileNetworkUtil(context)).build()); 
     } 
     return jobManager; 
    } 
} 

Kein Lüfter.

Also, wie soll man soll die Abhängigkeitsbaum strukturieren und zerreißen, ohne eine große gigantische über Blob-Komponente zu machen, die jedes einzelne Modul hat aufgelistet und jede einzelne Bestimmung Methode (statt diese „Subkomponente "Komponentenabhängigkeiten)?

Ich habe versucht, Unterkomponenten dafür zu verwenden, aber dann müssen Sie jedes einzelne Modul für die endgültige ApplicationComponent bereitstellen.

Ich bin mir nicht sicher, was ich hier tun soll. Ich habe versucht, @Singleton für jede Komponente der ersten Ebene und @SubcomponentScope für jede AppDataLevelComponent, ich habe auch versucht, einen neuen Bereich für jede einzelne Teilkomponente, aber beide mit "kann nicht auf mehrere Zielkomponenten abhängen".

EDIT: Offenbar um scoped Anbieter zu bekommen, um die Komponenten mit dem Umfang Kennzeichnung ist nicht genug - Sie müssen den Spielraum für die @Provides kommentierten Methoden spezifizieren.

@Module 
public class RepositoryModule { 
    @Provides 
    @Singleton 
    public PersonRepository personRepository() { 
     return new PersonRepositoryImpl(); 
    } 

    @Provides 
    @Singleton 
    public ScheduleRepository schedulesRepository() { 
     return new SchedulesRepositoryImpl(); 
    } 
} 

In der Zwischenzeit habe ich diese Komponente übergelaufen.

@Singleton 
@Component(modules = { 
     AppContextModule.class, 
     DbMapperModule.class, 
     DbTaskModule.class, 
     RealmModule.class, 
     RepositoryModule.class, 
     InteractorModule.class, 
     ServiceModule.class, 
     PresenterModule.class, 
     XmlPersisterModule.class 
}) 
public interface ApplicationComponent 
     extends AppContextComponent, AppDataComponent, AppDomainComponent, AppUtilsComponent, AppPresentationComponent { 

Wo die xyzComponent Klassen sind nur Schnittstellen die Bereitstellung Methoden zu speichern ...

(Bitte beachten Sie, dassthis structure is an anti-pattern as described by Martin Fowler, and you should organize modules based on features/activities, und sie machen in subscoped Komponenten Komponentenabhängigkeiten. Component Abhängigkeiten werden verwendet, um subscope Ihre superscope Komponenten und Abhängigkeit Anbieter „erben“.)

Antwort

Verwandte Themen