Dagger 2子组件与组件依赖关系

Dagger 1的plus()方法是我在以前的应用程序中经常使用的东西,所以我理解您可能希望有一个子组件完全访问父图绑定的情况。

在什么情况下使用组件依赖而不是子组件依赖是有益的,为什么?

组件依赖关系 – 在以下情况下使用它:

  • 你想保持两个组件独立。
  • 你想显式地显示一个组件的依赖关系是由另一个组件使用的

子组件 – 在以下情况下使用它:

  • 你想保持两个组件的凝聚力
  • 你可能并不关心明确显示另一个组件的依赖关系

我将尝试通过举例来展示这一点。 鉴于我们有以下模块和类。 SomeClassB1依赖于SomeClassA1 。 注意ModuleBprovideSomeClassB1方法,它显示了这种依赖关系。

 @Module public class ModuleA { @Provides public SomeClassA1 provideSomeClassA1() { return new SomeClassA1(); } } @Module public class ModuleB { @Provides public SomeClassB1 provideSomeClassB1(SomeClassA1 someClassA1) { return new SomeClassB1(someClassA1); } } public class SomeClassA1 { public SomeClassA1() {} } public class SomeClassB1 { private SomeClassA1 someClassA1; public SomeClassB1(SomeClassA1 someClassA1) { this.someClassA1 = someClassA1; } } 

请注意下面的组件相关性示例中的以下几点:

  • SomeClassB1依赖于SomeClassA1ComponentB必须明确定义依赖关系。
  • ComponentA不需要声明ModuleB 。 这保持了两个组件的独立性。
 public class ComponentDependency { @Component(modules = ModuleA.class) public interface ComponentA { SomeClassA1 someClassA1(); } @Component(modules = ModuleB.class, dependencies = ComponentA.class) public interface ComponentB { SomeClassB1 someClassB1(); } public static void main(String[] args) { ModuleA moduleA = new ModuleA(); ComponentA componentA = DaggerComponentDependency_ComponentA.builder() .moduleA(moduleA) .build(); ModuleB moduleB = new ModuleB(); ComponentB componentB = DaggerComponentDependency_ComponentB.builder() .moduleB(moduleB) .componentA(componentA) .build(); } } 

请注意SubComponent示例中的以下几点:

  • SomeClassB1依赖于SomeClassA1ComponentB不需要显式地定义依赖关系。
  • ComponentA必须声明ModuleB 。 这使得两个组件耦合。
 public class SubComponent { @Component(modules = ModuleA.class) public interface ComponentA { ComponentB componentB(ModuleB moduleB); } @Subcomponent(modules = ModuleB.class) public interface ComponentB { SomeClassB1 someClassB1(); } public static void main(String[] args) { ModuleA moduleA = new ModuleA(); ComponentA componentA = DaggerSubComponent_ComponentA.builder() .moduleA(moduleA) .build(); ModuleB moduleB = new ModuleB(); ComponentB componentB = componentA.componentB(moduleB); } } 

根据文件 :

Component Dependency使您只能通过组件依赖关系访问作为供应方法公开的绑定,即只能访问在父Component中声明的types。

Submodules允许您在声明时从父级访问整个绑定图,即您可以访问在其Module声明的所有对象。

比方说,你有一个ApplicationComponent包含所有Android相关的东西( LocationServiceResourcesSharedPreference等)。 你也想让你的DataComponentWebService一起pipe理持久化的事物来处理API。 DataComponent唯一缺less的是驻留在ApplicationComponent Application Context 。 从DataComponent获取Context的最简单方法是ApplicationComponent的依赖。 你需要确保你有一个在ApplicationComponent显式声明的Context ,因为你只能访问声明的东西。 在这种情况下,没有手动工作,这意味着您不需要在父Component指定Submodules ,并将子模块显式添加到父模块,如:

 MySubcomponent mySubcomponent = myComponent.plus(new ChildGraphModule("child!")); // No need! 

现在考虑一下这种情况,你想从DataComponentLocationService DataComponent WebService注入到使用上面的@Submodule plusfunction进行绑定的Fragment中。 这里最酷的是你绑定的组件( ApplicationComponent )不需要公开WebServiceLocationService因为你可以立即访问整个graphics。