【问题标题】:Order of dependency injection when using scopes使用范围时的依赖注入顺序
【发布时间】:2016-12-17 10:38:45
【问题描述】:

我目前正在尝试找出 Dagger 2。我正在尝试设置 4 个范围:应用程序、用户、活动、片段。 User 和 Activity 组件是 App 的子组件。 Fragment 是一个以 Activity 为依赖的组件。

假设我的 UserSettingsActivity 需要一个 Toolbar(由 ActivityModule 提供)和一个 UserProfile(由 UserModule 提供)。在我从数据库中请求之前,我不会得到 UserProfile,而 Toolbar 可以立即提供。所以注入的顺序是先进入ActivityComponent,然后进入UserComponent。我有 2 个@Inject 字段,一个用于工具栏,一个用于活动中的 UserProfile。我希望 dagger 会知道依赖项来自不同的模块,但它似乎抱怨注入 ActivityComponent 时无法提供 UserProfile。明明是ActivityModule不能提供的,为什么UserProfile是UserModule提供的不建立连接呢?

【问题讨论】:

    标签: android dependency-injection dagger-2


    【解决方案1】:

    据我所知,Dagger-2 不支持“部分注入”。

    因此,当您调用myComponent.inject(this) 时,如果myComponent 无法提供this 的所有@Inject 注释成员,则Dagger-2 会引发错误。

    我看到了解决此限制的两种方法:

    1. UserProfile中移除@Inject注解,通过UserComponent中的公共方法暴露UserProfile,并在UserComponent可以使用时手动注入。与此类似的东西:userProfile = userComponent.getUserProfile()
    2. 不要让UserComponent 依赖于数据获取。 UserComponent 可用于同时注入Toolbar 和一些UserProfileProvider,当可用时,您将从UserProfileProvider 获取UserProfile

    我个人认为第二种方法是更好的选择。应该使用 DI 库以满足构建时对象的依赖关系。在Android中我们不能自己构造ActivityFragment,所以我们在onCreate()onAttach()onCreateView()等中进行DI,但这并不意味着我们应该按顺序使用DI库协助控制应用程序的流程。

    【讨论】:

    • 你能看看这个类似的问题吗?我被卡住了:|
    【解决方案2】:

    子组件的工作类似于继承(扩展),在您的情况下,用户组件和活动组件扩展了应用程序组件,但用户组件和活动组件之间没有关系,因此当您在活动中请求用户依赖项时,它将失败。

    子组件不能提供对其他子组件的任何依赖。

    相反,您可以将 Activity 组件作为 User 组件的子组件。这也将使您可以灵活地切换用户。

    【讨论】:

    猜你喜欢
    • 2014-07-30
    • 1970-01-01
    • 2017-03-20
    • 1970-01-01
    • 2017-04-25
    • 2020-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多