【问题标题】:Can Dagger 2 have scopes shorter than an Activity life?Dagger 2 的作用域可以短于 Activity 寿命吗?
【发布时间】:2015-12-29 16:37:15
【问题描述】:

我一直在研究 Dagger 2 中的自定义作用域(thisthis 是我试图将代码作为基础的),但有一件事我似乎仍然无法理解,我看到您可以创建具有自定义范围的组件,然后该组件包含的模块的所有提供形式将与组件的范围相同(组件中的单例)或无范围的,每次都会返回新实例你得到一个。

但是,我仍然不明白的是,如果你有一个用户范围,然后你有一些模块绑定到该范围,假设你的网络组件被绑定到它,所以网络调用使用当前用户信息,如果你在Activity生命周期中注销用户(或登录用户),它会改变你当前标记为@Inject的对象引用吗?或者当您在活动 onCreate 方法中调用 .inject(this) 时获得的任何实例? 或者您应该再调用一次 inject 以便再次映射引用?

非常感谢您对此事的任何帮助:)

【问题讨论】:

    标签: android dependency-injection dagger-2 custom-scope


    【解决方案1】:

    tl;dr 您必须自己管理一切。没有刷新,您必须重新创建或至少重新加载部分活动。

    作用域提供一些编译时间信息并帮助您保持代码“可读”。要实际交换组件,您必须自己做。是的,您必须围绕此构建您的设计,相应地重新创建依赖组件。

    如果用户登录/注销,您将必须创建一个新的UserModule 和引用新用户的组件,提供登录/注销对象。这是您需要为依赖它的所有未来组件引用的新组件。

    @Inject 带注释的字段不会自动刷新,尽管您可以将第二次注入相同的字段,但对象将被覆盖。

    在第二个link you provided 中,他们确实实现了某种交换用户信息的功能。这是通过将UserComponent 保留在应用程序类中来完成的。

    【讨论】:

    • 感谢您的回复,是的,我认为它必须是这样的,这就是我目前正在做的事情,但是,我遇到了看起来你无法注入的问题2个组件,所以我需要有一个存根用户的usercomponent,然后当有一个真正的用户时再次注入,因为我不能注入我的“basecomponent”加上它试图获取所有的“usercomponent”从一个注射。
    • 所以这意味着@singleton只是为了澄清而没有任何真正的目的?谢谢。
    • @hqt Any Scope(包括Singleton)只是一个解决依赖关系的名称(如果范围a依赖于b那么b 不能依赖 a (循环)),无论是称为单例还是 foo 都没有关系,作用域本身封装了“属于”在一起的依赖项,因为它们(可能)依赖于每个其他并且具有相似的寿命
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-23
    • 2018-04-09
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多