2017-09-04 74 views
0

我从这个文档阅读https://google.github.io/dagger/api/latest/dagger/Component.htmlSubComponents之间Component Dependencies差异,阅读这个线程太Dagger 2 subcomponents vs component dependencies子VS组件的依赖

谁能帮我这行用一个例子手段。

子组件可以使用由它们的祖先组件和子组件定义的任何绑定。作为替代方案,组件可以通过声明组件依赖关系来仅使用来自另一个组件接口的绑定。当一个类型被用作组件依赖时,依赖项的每个提供方法都被绑定为一个提供者。请注意,只有通过组件依赖关系才能看到作为供应方法公开的绑定。

回答

4

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

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


让我们假设我们有2个匕首可以创建和提供的类。无论这可能是什么。无论使用构造函数注入还是从模块创建对象都没关系......我们假设我们有一些可以由BaseComponent提供的2个类,我将在下面展示它们。

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

它们来自何处并不重要。下一部分是有趣的一点。我们声明这些类中的一个作为组件接口上方法的返回类型。这就是匕首所称的配置方法。它说这个组件可以提供这个类。

@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匕首会告诉你,它不能提供...

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

一个扩展了父母,另一种使用其公共API。

+1

请不要把它想象成一个子组件,比如java SubComponent extends ParentComponent。组件和子组件之间没有继承关系。相反,将它们看作内部类(它们以这种方式实现),因为您可以访问封闭组件中的所有内容。 – gk5885