我无法理解告诉组件什么是他的模块和告诉组件它的组件依赖性之间的区别。
例如:
@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();
}
这有什么区别:
@Component (modules = {ModuleA.class, ModuleB.class})
public interface ComponentB {
DependencyB getDependencyB();
}
那:
@Component (dependencies = {ComponentA.class}, modules = {ModuleB.class})
public interface ComponentB {
DependencyB getDependencyB();
}
答案 0 :(得分:1)
对于你的简单案例,他们的行为大致相同;如果您愿意,您可以考虑Dagger对组件依赖性的处理,就好像它安装了一个自动生成的模块,它包装了每个提供方法(零工厂方法)委托给您传入的实例的@Provides
方法的依赖关系。在任何一种情况下,Dagger都会生成一个Factory / Provider类实现,该实现委托给您使用的模块/依赖方法。
然而,存在一些重大差异,包括:
@Provides
声明模块提供方法,以便Dagger使用它们,这也允许使用非公开的零参数方法。组件依赖关系将每个零arg方法视为潜在的提供者。@Module
进行注释。组件依赖关系可以是任意类型(不一定只是@Component
- 带注释的实例),无论Dagger是否生成它,您都可以传递任何实现。@Binds
在图形中表达声明性绑定。根据定义,组件依赖项是实例,并且无法访问对象图中的任何内容。简而言之,将模块视为配置的图形和组件依赖关系从图表外部。除了您上面描述的狭窄重叠之外,您应该非常清楚任何特定类别的角色。