2017-09-04 72 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