簡體   English   中英

Dagger 2模塊與子組件

[英]Dagger 2 Modules vs Subcomponents

假設我要創建一個存儲庫,它將成為我的單一真理來源。 在其中,我們將可以訪問REST調用和數據庫連接,以將REST調用保存為緩存。

如果我想通過Dagger 2注入此存儲庫,但是我希望它可以被其他存儲庫實現替換(避免使用“模塊化”一詞),或者希望將其在其他組件上使用,則應將其創建為存儲庫模塊還是作為存儲庫子組件?

什么時候應該使用模塊,什么時候應該使用子組件來實現模塊化?

模塊代表相關功能和綁定的組 ,可能正是您要尋找的。 通過創建文檔化和可重用的模塊,您可以封裝創建存儲庫的責任,從而允許其他開發人員或團隊使用存儲庫而不知道如何或在何處創建存儲庫。 您甚至可以選擇將存儲庫的構造函數設置為私有,以便控制如何使用它。

與Dagger 1不同,Dagger 2期望模塊不一定是完整的:它們可以引用未定義或指定的綁定。 因此,如果要創建依賴於外部組件的可重用模塊,則可能需要從外部記錄其需要的綁定類型。 (當然,您也可以使用Module.includes自己指定此名稱,但這會阻止使用者在選擇依賴項時使用您的模塊。替換依賴項可能是測試策略的重要組成部分,例如使用偽造的集成測試網絡后端。)

相反,子組件通常代表不同的范圍和生命周期 在Android應用中,這可能是服務,活動或片段的生命周期,但是您也可以定義自己的作用域:您還可以選擇一些代表用戶的登錄作用域(即,與用戶一樣長的相同對象)已登錄,但一旦用戶注銷或以其他人身份登錄,就會有新對象)。


但是,這兩種選擇都不是或非,尤其是在使用子組件進行封裝時 如果您的存儲庫需要許多您不想從應用程序的其余部分注入的綁定,則可以選擇將這些綁定綁定到僅包含在子組件內的模塊中。 看起來像這樣:

@Provides Repository provideRepository(RepositorySubcomponent subcomponent) {
  return subcomponent.getRepository();  // defined on the subcomponent
}

同樣,您可能還需要在子圖中綁定特定的綁定。 也許您的應用程序需要兩個獨立的存儲庫后端,以及兩個獨立的存儲實例。 這對於創建可重用的存儲庫可能是個問題,因為相同的圖形無法為相同的綁定注入不同的后端。 (這有時被稱為“機器人腿”問題 ,想象一個機器人使用相同的腿和膝蓋,但左右腳卻不同。)使用子組件,您可以選擇將其作為構建器的后端部分:

@Provides @Foo Repository provideFooRepository(
    RepositorySubcomponent.Builder builder,
    StoneTabletStorage stoneTabletStorage) {
  // Inject and use the builder instead, since we're passing in a required value.
  // In this example, you'd need to define a method on the builder,
  // @BindsInstance Builder storage(Storage storageImpl);
  return builder
             .storage(stoneTabletStorage)
             .build()
             .getRepository();
}

@Provides @Bar Repository provideBarRepository(
    RepositorySubcomponent.Builder builder,
    HolographicQubitStorage holographicQubitStorage) {
  return subcomponent
             .storage(holographicQubitStorage)
             .build()
             .getRepository();
}

...或為每個定義單獨的子組件:

@Subcomponent(modules = {RepositoryModule.class, StoneTabletStorageModule.class})
public interface FooSubcomponent {
  Repository getFooRepository();
}

@Subcomponent(modules = {RepositoryModule.class, HolographicQubitStorageModule.class})
public interface BarSubcomponent {
  Repository getBarRepository();
}

您還可以通過在Modules.subcomponents上列出子組件來組合這些技術,從而創建可重復使用的模塊 ,該模塊可 根據需要安裝子組件 這使子組件成為模塊的實現細節,在保留其他開發人員和團隊使用的綁定的同時,為您提供了更大的靈活性來更改模塊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM