我对 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();
}
}
当我运行匕首编译器时,我得到如下信息:
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
我在这里做错了什么?我认为它与includes/addsTo 有关,但是当我删除这些时,我会遇到其他错误。
如果我从 MyAppModule 中删除 includes = AnalyticsModule.class 我会得到如下信息:
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,然后将提供的错误报告器交给 MyAppModule,一切都很好,但是我必须公开我的具体 impl 类,以便我可以在其他模块中使用它。