Я все еще новичок в 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, а затем передам ProvideErrorReporter MyAppModule, но тогда мне придется сделать свой конкретный класс реализации общедоступным, чтобы я мог использовать его в другом модуле.
includes = MyAppModule.class
в аннотации кAnalyticsModule
? Потому что это сформировало бы цикл. Такжеplus(new AnalyticsModule())
не нужен,includes = AnalyticsModule.class
сделает это за вас. - person Tavian Barnes   schedule 05.02.2014