首页 > 解决方案 > Dagger 2 中作用域的必要性是什么?

问题描述

我明白为什么我们在匕首中使用范围。但我不明白为什么范围是必要的?如果我理解正确,范围用于在范围内拥有单例对象。但是,依赖图不是决定对象的单例性质吗?这意味着,只要我有依赖图,并且我使用相同的依赖树进行注入,我就会得到相同的单例对象。

如果是,那么这应该可以单独使用 @singleton 注释来实现。但是当我必须创建依赖组件时,我不得不创建新的自定义范围。

标签: androiddependency-injectiondagger-2

解决方案


如果我理解正确,范围用于在范围内拥有单例对象。

范围绑定指示 Dagger在组件的整个生命周期内始终返回相同的实例。您遇到了一个常见的情况,即 Singleton:如果您有一个打算与应用程序具有相同生命周期的组件,并且您将该组件注释为 @Singleton,那么该组件中您注释为 @Singleton 的任何内容都将同样具有与应用程序相同的生命周期和生命周期。

然而,一旦你在 Dagger 中创建了多个组件,它们必然不能具有相同的生命周期:如果组件 B 依赖于组件 A,则必须在你已经拥有组件 A 的实例之后创建组件 B。因此,它不会这两个范围具有相同的范围注释真的没有意义——即使碰巧知道您的应用程序代码可以将这两个组件视为长期存在的单例组件,您只是为了清楚起见而将它们分开、可重用性或并行代码生成。这也是您不能拥有@Singleton具有依赖关系的组件的原因:您的 @Singleton 组件旨在最好地包含 VM 的生命周期,因此如果您在此之前创建了其他对象以作为依赖项提供,那么这可能会令人困惑。

综上所述,创建一个新的范围很容易,一旦你这样做了,你就可以使用这些多个范围来表示应用程序中不同的逻辑生命周期(例如 Android Activity 或 Fragment 的生命周期,用户登录会话的生命周期,Web 服务器中单个请求的生命周期,等等)。


推荐阅读