Все още съм нов в Dagger и се опитвам да схвана нещата. Исках да разделя моите модули на логически групи, всяка от които предоставя собствена функционалност, но в общи линии ще действа по същия начин, както ако е в един модул.
Например, да кажем, че имам основния си приложен модул, дефиниран както следва:
//com.example.android.MyAppModule.java
@Module(
includes = AnalyticsModule.class,
injects = { <snip> }
)
public class MyAppModule {
// various provides
}
И имам друг модул, дефиниран по този начин, който настройва интерфейс на ErrorReporter и предоставя конкретното им изпълнение.
// com.example.android.analytics.AnalyticsModule.java
@Module(
addsTo = MyAppModule.class,
injects = { MyApp.class }
)
public class AnalyticsModule(){
// ErrorReporter is a public interface and ErrorReporterImpl is a package-local final concrete class that implements it
@Provides @Singleton
ErrorReporter providesErrorReporter(ErrorReporterImpl reporter) { return reporter };
}
В моя клас Application настроих обектната графика така:
// com.example.android.MyApp.java
public class MyApp extends Application {
@Inject ErrorReporter errorReporter;
@Override
public void onCreate() {
super.onCreate();
applicationGraph = ObjectGraph
.create(new MyAppModule())
.plus(new AnalyticsModule());
applicationGraph.inject(this);
errorReporter.initialize();
}
}
Когато стартирам компилатора на dagger, получавам нещо подобно:
Graph validation failed: Module Inclusion Cycle:
0. com.example.android.analytics.AnalyticsModule included by com.example.android.MyAppModule
1. com.example.android.modules.MyAppModule included by com.example.android.analytics.AnalyticsModule
0. com.example.android.analytics.AnalyticsModule
Какво правя грешно тук? Предполагам, че има нещо общо с include/addsTo, но когато ги премахна, получавам други грешки.
Ако премахна include = AnalyticsModule.class от MyAppModule, получавам нещо подобно:
com.example.android.analytics.ErrorReporter could not be bound with key com.example.android.analytics.ErrorReporter required by com.example.android.MyApp for com.example.android.MyAppModule
Всичко е наред, ако напълно се откажа от AnalyticsModule и след това предам providesErrorReporter на MyAppModule, но тогава трябва да направя моя конкретен impl клас публичен, за да мога да го използвам в другия модул.
includes = MyAppModule.class
в анотацията наAnalyticsModule
? Защото това би образувало цикъл. Освен товаplus(new AnalyticsModule())
е ненужен,includes = AnalyticsModule.class
ще направи това вместо вас. - person Tavian Barnes   schedule 05.02.2014