gpt4 book ai didi

android - Dagger 2 模块和依赖项的区别

转载 作者:行者123 更新时间:2023-11-29 01:11:37 25 4
gpt4 key购买 nike

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

例如:

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

最佳答案

对于您的简单案例,它们的行为大致相同;如果你愿意,你可以认为 Dagger 对组件依赖项的处理就像它安装了一个自动生成的模块,该模块用 @Provides 委托(delegate)给您传入的实例的方法。无论哪种情况,Dagger 都会生成一个 Factory/Provider 类实现,委托(delegate)给您使用的模块/依赖项方法。

但是,也有一些很大的不同,包括:

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

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

关于android - Dagger 2 模块和依赖项的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42608456/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com