模块和依赖之间的Dagger2差异

时间:2017-03-05 12:41:06

标签: android dagger-2

我无法理解告诉组件什么是他的模块和告诉组件它的组件依赖性之间的区别。

例如:

@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();
}

1 个答案:

答案 0 :(得分:1)

对于你的简单案例,他们的行为大致相同;如果您愿意,您可以考虑Dagger对组件依赖性的处理,就好像它安装了一个自动生成的模块,它包装了每个提供方法(零工厂方法)委托给您传入的实例的@Provides方法的依赖关系。在任何一种情况下,Dagger都会生成一个Factory / Provider类实现,该实现委托给您使用的模块/依赖方法。

然而,存在一些重大差异,包括:

  • 模块可以采用来自对象图的其他任意方法参数。组件依赖关系中的提供方法必须为零arg。这是最重要的区别:组件依赖是纯粹的外部工厂,而不是对象图中的完全参与者。
  • 必须使用@Provides声明模块提供方法,以便Dagger使用它们,这也允许使用非公开的零参数方法。组件依赖关系将每个零arg方法视为潜在的提供者。
  • 模块必须使用@Module进行注释。组件依赖关系可以是任意类型(不一定只是@Component - 带注释的实例),无论Dagger是否生成它,您都可以传递任何实现。
  • 模块和模块方法将检查其范围;它们必须与封闭组件的范围兼容。组件依赖性未经范围检查。
  • 模块可以是抽象类或接口,允许您使用@Binds在图形中表达声明性绑定。根据定义,组件依赖项是实例,并且无法访问对象图中的任何内容。
  • 当然,模块可以声明它们使用的子组件或它们对其他模块的依赖关系。组件依赖性既不能做;他们只是外部工厂。
  • 如果具有零参数公共方法,则不需要在组件构建器中提供可实例化模块。组件依赖must be provided,即使您提供具体类型Dagger也可以实例化。

简而言之,将模块视为配置的图形和组件依赖关系从图表外部。除了您上面描述的狭窄重叠之外,您应该非常清楚任何特定类别的角色。