Dagger 2子组件与组件依赖关系
Dagger 1的plus()
方法是我在以前的应用程序中经常使用的东西,所以我理解您可能希望有一个子组件完全访问父图绑定的情况。
在什么情况下使用组件依赖而不是子组件依赖是有益的,为什么?
组件依赖关系 – 在以下情况下使用它:
- 你想保持两个组件独立。
- 你想显式地显示一个组件的依赖关系是由另一个组件使用的
子组件 – 在以下情况下使用它:
- 你想保持两个组件的凝聚力
- 你可能并不关心明确显示另一个组件的依赖关系
我将尝试通过举例来展示这一点。 鉴于我们有以下模块和类。 SomeClassB1
依赖于SomeClassA1
。 注意ModuleB
的provideSomeClassB1
方法,它显示了这种依赖关系。
@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
依赖于SomeClassA1
。ComponentB
必须明确定义依赖关系。 -
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
依赖于SomeClassA1
。ComponentB
不需要显式地定义依赖关系。 -
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
相关的东西( LocationService
, Resources
, SharedPreference
等)。 你也想让你的DataComponent
与WebService
一起pipe理持久化的事物来处理API。 DataComponent
唯一缺less的是驻留在ApplicationComponent
Application Context
。 从DataComponent
获取Context
的最简单方法是ApplicationComponent
的依赖。 你需要确保你有一个在ApplicationComponent
显式声明的Context
,因为你只能访问声明的东西。 在这种情况下,没有手动工作,这意味着您不需要在父Component
指定Submodules
,并将子模块显式添加到父模块,如:
MySubcomponent mySubcomponent = myComponent.plus(new ChildGraphModule("child!")); // No need!
现在考虑一下这种情况,你想从DataComponent
和LocationService
DataComponent
WebService
注入到使用上面的@Submodule
plus
function进行绑定的Fragment
中。 这里最酷的是你绑定的组件( ApplicationComponent
)不需要公开WebService
和LocationService
因为你可以立即访问整个graphics。