使用范围时的依赖注入顺序
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 将抛出错误。
我看到有两种解决此限制的方法:
- 从
UserProfile
中删除@Inject
注释,通过UserComponent
中的public方法公开UserProfile
,并在UserComponent
准备就绪时手动注入要使用的。与此类似的东西:userProfile = userComponent.getUserProfile()
- 不要让
UserComponent
依赖于数据获取。 UserComponent
可用于同时注入 Toolbar
和一些 UserProfileProvider
,当可用时,您将从 UserProfileProvider
获取 UserProfile
。
我个人认为第二种方法是更好的选择。应该使用 DI 库来满足构造时对象的依赖性。在Android中我们无法自己构造Activity
或Fragment
,因此我们在onCreate()
、onAttach()
、onCreateView()
等中进行DI,但这并不意味着我们应该使用 DI 库来帮助控制应用程序的流程。
我目前正在尝试找出 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 将抛出错误。
我看到有两种解决此限制的方法:
- 从
UserProfile
中删除@Inject
注释,通过UserComponent
中的public方法公开UserProfile
,并在UserComponent
准备就绪时手动注入要使用的。与此类似的东西:userProfile = userComponent.getUserProfile()
- 不要让
UserComponent
依赖于数据获取。UserComponent
可用于同时注入Toolbar
和一些UserProfileProvider
,当可用时,您将从UserProfileProvider
获取UserProfile
。
我个人认为第二种方法是更好的选择。应该使用 DI 库来满足构造时对象的依赖性。在Android中我们无法自己构造Activity
或Fragment
,因此我们在onCreate()
、onAttach()
、onCreateView()
等中进行DI,但这并不意味着我们应该使用 DI 库来帮助控制应用程序的流程。