子组件与组件依赖关系

时间:2017-09-04 18:14:07

标签: java android dependency-injection dagger-2

我从此文档https://google.github.io/dagger/api/latest/dagger/Component.html中读取了SubComponentsComponent Dependencies之间的区别,并且也阅读了此帖子Dagger 2 subcomponents vs component dependencies

任何人都可以通过一个例子来帮助我解决这条线的含义。

  

SubComponents可以使用由其祖先组件和子组件定义的任何绑定。作为替代方案,组件可以通过声明组件依赖性来仅使用来自另一个组件接口的绑定。当类型用作组件依赖项时,依赖项上的每个提供方法都绑定为提供程序。请注意,只有通过组件依赖性提供作为提供方法公开的绑定。

1 个答案:

答案 0 :(得分:5)

将其视为像java SubComponent extends ParentComponent这样的子组件,其中一切都是protected。它可以访问与父级相同的成员,并可以使用所有父母的东西。

另一方面,组件依赖类似于委托对象,您只能访问该类公开的公共方法。

让我们假设我们有两个Dagger可以创建和提供的类。无论这可能是什么。如果使用构造函数注入或从模块创建对象并不重要......我们假设我们有一些BaseComponent可以提供的类,我将在下面展示。

// some module can create either object
class ComponentPrivateObject {}
class ExposedObject {}

它们来自哪里并不重要。下一部分是有趣的一点。我们将这些类的一个声明为组件接口上方法的返回类型。这就是Dagger所谓的提供方法。它说这个组件可以提供那个类。

@Component(modules=/* some modules */)
class BaseComponent {

  // BaseComponent can provide ExposedObject!
  ExposedObject exposedObject();

}

子组件和从属组件之间的区别在于,与开头的Java示例一样,Subcomponent可以访问ComponentPrivateObjectExposedObject,因为它只是扩展父母图。

// can use either class, it just adds to the parent
@Subcomponent
class Subcomponent {}

另一方面,DependentComponent只能访问ExposedObject。它不会扩展BaseComponent的图形,但它只是将BaseComponent绑定为某些对象的提供者。与上面的Java示例一样,它就像使用其公共API一样,如果您尝试使用ComponentPrivateObject,Dagger会告诉您无法提供...

// binds component dependency as provider
@Component(dependency=BaseComponent.class)
class DependentComponent{}

一个扩展父级,另一个使用其公共API。