[英]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.