我从此文档https://google.github.io/dagger/api/latest/dagger/Component.html中读取了SubComponents
和Component Dependencies
之间的区别,并且也阅读了此帖子Dagger 2 subcomponents vs component dependencies
任何人都可以通过一个例子来帮助我解决这条线的含义。
SubComponents可以使用由其祖先组件和子组件定义的任何绑定。作为替代方案,组件可以通过声明组件依赖性来仅使用来自另一个组件接口的绑定。当类型用作组件依赖项时,依赖项上的每个提供方法都绑定为提供程序。请注意,只有通过组件依赖性提供作为提供方法公开的绑定。
答案 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
可以访问ComponentPrivateObject
和ExposedObject
,因为它只是扩展父母图。
// 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。