我无法理解告诉组件他的模块是什么和告诉组件它的组件依赖项是什么之间的区别。
例如:
@Module public class ModuleA {
@Provides DependencyA providesDependencyA() {
return new DependencyA();
}
}
@Module public class ModuleB {
@Provides DependencyB providesDependencyB() {
return new DependencyB();
}
}
@Component (modules = {ModuleA.class})
public interface ComponentA {
DependencyA getDependencyA();
}
Run Code Online (Sandbox Code Playgroud)
这有什么区别:
@Component (modules = {ModuleA.class, ModuleB.class})
public interface ComponentB {
DependencyB getDependencyB();
}
Run Code Online (Sandbox Code Playgroud)
然后:
@Component (dependencies = {ComponentA.class}, modules = {ModuleB.class})
public interface ComponentB {
DependencyB getDependencyB();
}
Run Code Online (Sandbox Code Playgroud)
对于您的简单情况,它们的行为大致相同;如果您愿意,您可以将 Dagger 对组件依赖项的处理视为安装一个自动生成的模块,该模块将依赖项上的每个提供方法(零参数工厂方法)包装为一个委托@Provides给您传入的实例的方法无论哪种情况,Dagger 都会生成一个 Factory/Provider 类实现,该实现委托给您使用的模块/依赖项方法。
但是,存在一些很大的差异,包括:
@Provides使用它们,这也允许使用非公开的零参数方法。组件依赖项将每个零参数方法视为潜在的提供者。@Module。组件依赖项可以是任意类型(不一定只是@Component带注释的实例),并且您可以传递任何实现,无论 Dagger 是否生成它。@Binds在图形中表达声明性绑定。根据定义,组件依赖项是实例,并且无法访问对象图中的任何内容。简而言之,将模块视为图形的配置,并将组件依赖项视为来自图形外部的外部组件。除了上面描述的狭窄重叠之外,对于任何给定的类别,您想要哪个角色应该非常清楚。