2017-03-05 40 views
2

我无法理解告诉组件是什么模块并告诉组件是什么组件依赖关系的区别。Dagger2模块和依赖关系的区别

例如:

@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

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

不过,也有很大的差异,其中包括:

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

总之,治疗模块作为图表和组件依赖性的结构从图表实习医生。除了上面描述的狭窄重叠之外,它应该很清楚您想要给任何给定类别的角色。