使用范围时的依赖注入顺序

Order of dependency injection when using scopes

我目前正在尝试找出 Dagger 2。我正在尝试设置 4 个范围:App、User、Activity、Fragment。 User 和 Activity 组件是 App 的子组件。 Fragment 是一个以 Activity 为依赖的组件。

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

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

子组件无法提供对其他子组件的任何依赖。

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

据我所知,Dagger-2 不支持 "partial injections"。

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

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

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

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