簡體   English   中英

Dagger 2 注入 subcomponent.builder

[英]Dagger 2 inject subcomponent.builder

我看到一些代碼在其中注入了SubComponent.Builder 例如:


class MyClass @Inject constructor(val mySubcomponentBuilder: MySubComponent.Builder) { 

    fun someFunc(knownAtRuntime: String) {
        mySubcomponentBuilder.withSomethingIKnowAtRuntime(knownAtRuntime).build()
    }    
}

我們為什么(以及我們應該在哪里/何時)這樣做(即注入 subcomponent.builders)?

這有點像輔助注入,我們可以在其中提供我們只在運行時知道的圖形所需的實例嗎?

是的,子組件構建器有點像輔助注入,但它是針對可注入 Dagger 依賴項的整個子圖。

什么是子組件?

子組件是從父組件派生的附加組件。 在 Guice 中,它們類似於兒童注射器 在 Dagger 1 中,它們類似於 子圖 它們允許您在父綁定之上添加附加綁定,如通過附加模塊指定的那樣。

從它們允許來自不同圖的綁定的意義上說,它們可以比作組件依賴,但它們與父組件同時生成,並且可以透明地使用父組件中定義的綁定。 dagger.android 和 Hilt 包都使用子組件。

每個組件都可以有自己的scope ,子組件也不例外:您可能會看到@Singleton ApplicationComponent的子組件為服務器的@RequestScope RequestComponent RequestComponent 或@ActivityScope ActivityComponent的子組件為 Android。每個請求或活動都會獲得自己的組件實例。 這會讓你注入一個@RequestScoped MetricsService@ActivityScoped User ,它們在相同的請求/活動中是相同的實例,但在請求/活動之間是不同的實例。

什么是子組件構建器?

如果子組件具有非空構造函數,則它們可能需要實例化模塊,或者它們可能需要通過@BindsInstance綁定實例。 Subcomponent Builder允許您像指定Component Builder一樣指定它們。

您還可以選擇使用Subcomponent.Factory ,類似於Component.Factory但將所有 Builder 參數作為 arguments 用於一次方法調用。

為什么我要注入子組件構建器? 有哪些選擇?

盡管您可以將子組件聲明為在父組件上指定的工廠方法,但這會阻止 Dagger 修剪未使用的依賴項,因為它看不到誰在請求子組件。 通過在模塊上聲明子組件並將它們的構建器注入到圖中,如果您根本不調用它們,Dagger 可以刪除整個子組件。

暫無
暫無

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

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