簡體   English   中英

Android dagger 依賴循環

[英]Android dagger dependency cycle

我有 2 個具有相同作用域的依賴項,它們彼此需要。

我的依賴項是具有不同方法的域服務(每種方法都有不同的業務案例)。 一些業務案例可能使用來自另一個領域的方法。

為了做到這一點,我需要 domain1 可用於 domain2,反之亦然。

但是當我這樣做時,我得到一個依賴循環編譯錯誤。 在谷歌搜索一段時間后,我發現為了解決這個問題,我必須使用 @Inject 注釋而不是 @Module 中的構造函數參數注入依賴項之一。

當我嘗試這個代碼編譯但匕首根本沒有注入第二個依賴項。

有沒有辦法用 Dagger 實現我想要的?

您的問題: AClass對BClass有一個構造函數依賴,它對AClass有一個構造函數依賴。 即使沒有Dagger,這也行不通:如果他們相互依賴,你會先創造哪個?

您嘗試的解決方案:如果使用new創建其中一個類(BClass),並且它不再具有@Inject -annotated構造函數,則可以等到構造完AClass之后再填充BClass實例。 但是,如果使用new創建對象,則需要通過將其傳遞給MembersInjector<BClass> -injection方法或MembersInjector<BClass>對象來注入它。 你還需要確保在@Provides方法之外發生這種情況(因為調用@Provides的原因是你可以構造一個值來傳遞給AClass的構造函數)。 這很脆弱,相當丑陋。

我的建議: 通過Provider使用間接 讓AClass注入Provider<BClass> ,或BClass注入Provider<AClass> ,或兩者兼而有之。 只要你不在構造函數中調用get ,你就可以讓Dagger創建AClass並推遲創建BClass直到你需要它為止。 您不需要額外的配置就可以為您綁定在Component中的任何類T注入Provider<T>Lazy<T> ; 有關可用進樣的完整列表,請參閱“用戶指南”中的“圖表中的結合”

我使用 dagger.Lazy 和 Hilt(幾乎與 dagger 相同 - 它在引擎蓋下使用 dagger)使這成為可能。 不過要小心。 循環依賴可能是糟糕設計的結果,並可能導致許多問題。 這是示例:

class Cls1 @Inject constructor() {
    @Inject lateinit var cls2: dagger.Lazy<Cls2>
}

class Cls2 @Inject constructor() {
    @Inject lateinit var cls1: dagger.Lazy<Cls1>
}

@HiltAndroidApp
class ApplicationClass: Application() {
    @Inject lateinit var cls1: Cls1
    @Inject lateinit var cls2: Cls2

    override fun onCreate() {
        super.onCreate()
    }
}

暫無
暫無

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

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