繁体   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