Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Dagger2模块和依赖项之间的差异_Android_Dagger 2 - Fatal编程技术网

Android Dagger2模块和依赖项之间的差异

Android Dagger2模块和依赖项之间的差异,android,dagger-2,Android,Dagger 2,我无法理解告诉组件什么是他的模块和告诉组件什么是它的组件依赖性之间的区别 例如: @Module public class ModuleA { @Provides DependencyA providesDependencyA() { return new DependencyA(); } } @Module public class ModuleB { @Provides DependencyB providesDependencyB() {

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

例如:

@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
方法将每个供应方法(零参数工厂方法)包装在依赖关系上。在任何一种情况下,Dagger都将生成一个工厂/提供者类实现,委托给您使用的模块/依赖项方法

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

  • 模块可以获取来自对象图的其他任意每个方法参数。组件依赖项中的配置方法必须为零arg。这是最显著的区别:组件依赖关系是纯外部工厂,而不是对象图中的完全参与者
  • 模块配置方法必须使用
    @声明,提供
    供Dagger使用,这也允许非公开的零arg方法。组件依赖项将每个零arg方法视为潜在的提供者
  • 模块必须用
    @Module
    注释。组件依赖关系可以是任意类型(不一定只是
    @Component
    -注释实例),并且无论Dagger是否生成,您都可以传递任何实现
  • 将检查模块和模块方法的作用域;它们必须与封闭组件的作用域兼容。组件依赖项未进行范围检查
  • 模块可以是抽象类或接口,允许您使用
    @Binds
    来表示图形中的声明性绑定。组件依赖关系根据定义是实例,不能访问对象图中的任何内容
  • 当然,模块可以声明它们使用的子组件或它们对其他模块的依赖关系。组件依赖性两者都不能做;他们只是外部工厂
  • 如果可实例化模块具有零arg公共方法,则不需要在组件生成器中提供它们。组件依赖关系,即使您要提供Dagger可以实例化的具体类型
简而言之,将模块视为图形的配置,将组件依赖项视为图形外部的外部对象。除了上面描述的狭窄重叠之外,对于任何给定的类,应该非常清楚您想要哪个角色