子组件与组件依赖性

N S*_*rma 2 java android dependency-injection dagger-2

我从此文档https://google.github.io/dagger/api/latest/dagger/Component.html中读取了它们之间的区别,SubComponents并且也阅读了此线程Dagger 2子组件与组件依赖关系Component Dependencies

有人可以帮我举例说明这句话的意思。

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

Dav*_*jak 7

可以将其视为类似于java的子组件SubComponent extends ParentComponent,其中所有组件都位于其中protected。它可以访问与父级相同的成员,并且只能使用父级的所有内容。

另一方面,组件依赖项就像一个委托对象,在这里您只能访问该类公开的公共方法。


让我们假设Dagger可以创建和提供2个类。不管是什么。不管您使用构造函数注入还是从模块创建对象都没有关系...我们仅假设我们拥有some可以提供的那两个类,BaseComponent我将在下面显示。

// some module can create either object
class ComponentPrivateObject {}
class ExposedObject {}
Run Code Online (Sandbox Code Playgroud)

它们来自哪里都无所谓。下一部分是有趣的部分。我们在组件接口的方法上将这些类之一声明为返回类型。这就是Dagger所谓的Provision方法。它说该组件可以提供该类。

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

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

}
Run Code Online (Sandbox Code Playgroud)

子组件和依赖组件之间的区别在于,就像开始时的Java示例一样,它们Subcomponent将可以访问这两个组件,ComponentPrivateObject并且ExposedObject因为它只是扩展了父图。

// can use either class, it just adds to the parent
@Subcomponent
class Subcomponent {}
Run Code Online (Sandbox Code Playgroud)

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

// binds component dependency as provider
@Component(dependency=BaseComponent.class)
class DependentComponent{}
Run Code Online (Sandbox Code Playgroud)

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

  • 请不要“将其视为像Java SubComponent这样的子组件扩展了ParentComponent”。组件和子组件之间没有继承关系。而是将它们视为内部类(它们是通过这种方式实现的),因为您可以从封闭的组件访问所有内容。 (7认同)