Dagger2活动范围,我需要多少个模块/组件?

6

我有一些关于自定义作用域的问题:

  1. 我正在使用MVP架构,需要为不同的活动注入不同的 presenter。为此,我创建了@ActivityScope。这是否意味着我必须为每个活动创建一个单独的模块/组件?
  2. 如果我仍然负责创建和释放这些依赖项,那么自定义范围注释的目的是什么?我不确定是否正确,但我可以在所有我的模块/组件中使用@Scope123,并没有任何区别。

我猜,至少你需要为每个想要从自定义作用域注入的Activity创建一个单独的组件。如果你想要从全局作用域进行注入,则不需要这样做。为此,你可以在自定义作用域中提供对Activity的依赖项,而不会创建内存泄漏。但我同意你的看法。这仍然不清楚。 - Christopher
2个回答

6
这是否意味着我必须为每个活动创建单独的模块/组件? 是的,也不完全是。至少,如果您想提供活动范围的依赖项(如Activity本身、LoaderManager或类似对象),则需要为每个活动创建一个新的组件对象,因为该作用域将与活动一样长。
是否需要为您的每个活动创建一个模块和组件取决于您的架构。您可能还可以创建一个通用的ActivityModule,其中包括您的模型、Presenter和View,并可以重复使用它。
如果只需要基本依赖项(例如LoaderManager或Activity本身)则可以仅使用一个Component,您可以编写一个ActivityModule来提供这些基本对象,并使用该模块向您的组件提供依赖项。如果Presenter(及其依赖项)可以通过构造函数注入创建,则可以为所有活动使用单个组件和模块。
如果Presenter和View是接口,则需要创建一个模块以提供实际实现。
自定义范围注释的目的是什么,如果我仍然负责创建和释放这些依赖项? 范围用于使管理那些依赖项更加容易。如上所述,活动作用域随着活动被销毁而消失。通过拥有这些作用域依赖项,您可以确保没有任何依赖于活动的对象具有更高的范围/生命周期并可能导致内存泄漏。
此外,我认为它们是依赖项的捆绑包,您可以热插拔并且可以“丢弃”。一个很好的例子是@UserScope,它将保存用户数据、登录、会话数据等。如果我切换用户,我只需要使用用户作用域或更低版本(关闭活动,删除UserComponent)就可以清除所有与该用户相关的内容。下一个用户可以登录,并且不存在副作用的风险。
范围主要是编译时检查,可帮助您将层次结构引入依赖项中,因为编译器所做的一切就是检查其中是否存在循环,并且检查是否有任何请求从无法访问的作用域中获取依赖项。

1
谢谢你的回答,在第一个问题中,我指的是不同的组件/模块类,而不是相同的ActivityModule实例。例如,在不同的活动中,我需要特定于该活动的不同依赖项(Presenter本身和仅在该活动中使用的用例/交互器)。因此,我的问题更多是关于标准-人们是否将所有依赖项放入一个ActivityModule类中,并在注入所需的依赖项时在所有地方使用它,还是将它们分为不同的模块。 - user1049280
@user1049280 这就是我想说的。你可以重复使用一些模块,并且只使用构造函数注入就可以走得很远。但是,一旦你需要为特定活动使用特定类,你就必须为这些类创建一个额外的组件/范围。 - David Medenjak
大家都写着“活动范围随着活动的销毁而消失”。你能否请给我看一下文档证明呢? - Sever
1
@服务器 组件是一个普通的Java对象。在活动被销毁后,它将随着活动和可能持有的任何其他内容一起被垃圾回收。 - David Medenjak

1
  1. 您需要做的最简单的方法是在应用程序级别创建一个组件,其中提供每种类型的演示文稿。问题在于,您将拥有所有项目的所有类在同一级别,这有点丑陋。 更好的方式是为注入当前Activity/fragment的依赖项创建活动的模块。

  2. 使用@ActivityScope或任何其他作用域只是显示该模块的生命周期不同于@Singleton,只要它不是单例,就会考虑您的模块与创建它的活动一样死亡。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接