Dagger2 模块和依赖项之间的区别

dan*_*din 3 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();
}
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)

Jef*_*ica 5

对于您的简单情况,它们的行为大致相同;如果您愿意,您可以将 Dagger 对组件依赖项的处理视为安装一个自动生成的模块,该模块将依赖项上的每个提供方法(零参数工厂方法)包装为一个委托@Provides给您传入的实例的方法无论哪种情况,Dagger 都会生成一个 Factory/Provider 类实现,该实现委托给您使用的模块/依赖项方法。

但是,存在一些很大的差异,包括:

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

简而言之,将模块视为图形的配置,并将组件依赖项视为来自图形外部的外部组件。除了上面描述的狭窄重叠之外,对于任何给定的类别,您想要哪个角色应该非常清楚。