我对 Dagger 还是个新手,正在努力掌握一些东西。我想将我的模块分成逻辑组,每个组都提供自己的功能,但基本上就像在一个模块中一样。
例如,假设我的主要应用程序模块定义如下:
//com.example.android.MyAppModule.java
@Module(
includes = AnalyticsModule.class,
injects = { <snip> }
)
public class MyAppModule {
// various provides
}
我还有另一个这样定义的模块,它设置了一个 ErrorReporter 接口(interface)并为其提供了具体的实现。
// 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 };
}
在我的应用程序类中,我像这样设置对象图:
// 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
我在这里做错了什么?我假设它与 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,然后将 providesErrorReporter 移交给 MyAppModule,一切都很好,但是我必须公开我的具体 impl 类,以便我可以在其他模块中使用它。
最佳答案
@Module(includes = AnalyticsModule.class)
对于将多个模块组合成一个模块很有用。在这种情况下,使用 .plus(new AnalyticsModule())
是错误的,因为 AnalyticsModule
已经包含在注释中的 includes
行中。所以你应该删除对 plus()
的调用。
@Module(addsTo = MyAppModule.class)
用于允许调用 .plus(new AnalyticsModule())
。由于我们已经删除了该调用,因此我们也应该删除 addsTo
。
@Module(complete = false)
是 AnalyticsModule
所必需的,因为它的某些依赖项无法单独满足。这没关系;只要 MyAppModule
具有 complete = true
(默认值),Dagger 就会进行必要的错误检查。
不可否认,“模块包含周期”错误有点不清楚。这个循环是由 A 包含 B 添加到 A 引起的。
关于android - Dagger 模块包含周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21535407/