Dagger2 activity 范围,我需要多少 modules/components?

Dagger2 activity scope, how many modules/components do i need?

我有几个关于自定义范围的问题:

  1. 我正在使用 MVP architecutre,我需要将不同的演示者注入到不同的活动中。为此,我创建了@ActivityScope。这是否意味着我必须为每个活动创建一个单独的 module/component?
  2. 如果我仍然负责创建和释放这些依赖项,自定义范围注释的目的是什么?不确定我是否正确,但我可以在我所有的 modules/components 中使用 @Scope123,这不会有任何区别。
  1. 最简单的方法是创建一个应用程序级组件,希望您提供每种类型的演示者。问题是您将在同一级别拥有所有项目的所有 类,这有点难看。 好的方法是为 activity 创建一个模块,为当前 Activity/fragment

  2. 注入依赖项
  3. 使用@ActivityScope 或任何其他只是表明模块的生命周期不同于@Singleton,只要它不是单例,考虑你的模块会像你的activity创建它的人会。

Does it mean that I must create a separate module/component for every activitiy?

是的。而没有。

至少你需要为每个activity创建一个新组件object,如果你想提供activity 范围内的依赖项,例如 Activity 本身、LoaderManager 或类似的东西,因为范围将与 activity.

一样长

您是否需要为您的每一项活动使用模块和组件的问题在很大程度上取决于您的体系结构。您也可以制作一个通用的 ActivityModule 提供您可以重用的模型、演示者和视图。

你也可以只用一个 Component 例如如果只需要 activity 的基本依赖项,例如 LoaderManagerActivity 本身,那么您可以编写一个 ActivityModule 来仅提供这些基础对象。然后,您可以将此模块与您的组件一起使用以提供依赖项。 如果您的 Presenter(及其依赖项)可以通过构造函数注入创建,您可以使用单个组件和模块来完成所有活动。

如果您的演示者和视图是实现的接口,您将需要创建一个提供实际实现的模块。

What is the purpose of custom scope annotations if I'm still responsible for creating and releasing those dependencies?

范围用于使这些依赖关系的管理更容易。如前所述,activity 作用域随着 activity 被销毁而消亡。通过具有这些范围内的依赖关系,您可以确保没有任何东西依赖于具有更高范围/生命周期并可能导致内存泄漏的 activity。

此外,我喜欢将其视为可以热交换的依赖包,并且只是 'throw out'。一个很好的例子是 @UserScope,它将保存用户数据、他的登录、会话数据,...
如果我切换用户,我只需要将用户范围或更小范围内的所有内容都扔掉(关闭 activity,删除 UserComponent),并且与用户相关的所有内容都将消失。下一个可以登录,副作用风险低

范围主要是编译时检查,帮助您将层次结构引入依赖项,因为编译器所做的只是检查其中没有循环,并且没有任何内容请求依赖项它无法访问的范围。