Dagger2 - activity 组件应该是其他组件的子组件吗?

Dagger2 - should an activity component be a sub-component of other?

我使用 @subcomponent 主要是因为案例活动需要使用应用程序组件中的一些共享对象,或者片段组件想要使用容器 activity 提供的一些对象。

现在我想知道是否可以让一些 activity 组件成为另一个 activity 组件的 subcomponent。例如,TaskDetailActivity有一个任务对象,想提供给其他一些活动,如TaskParticipantActivityTaskProgressActivity和一些片段。

向其他 Activity 提供任务对象的传统方式是将其设置为 intent 对象,但是如果我们想在这种情况下使用 Dagger2 呢?

更新:我的情况与本文 http://frogermcs.github.io/dependency-injection-with-dagger-2-custom-scopes/ 中的 UserScope 情况类似,但我可以将用户组件保存在 activity 中,而不是将用户组件保存在应用程序 class 中吗?即 TaskDetailActivity?

组件用于对具有相似生命周期的对象进行分组。虽然组件可能恰好对应于一组特定的功能(例如 TaskComponent 用于注入 TaskActivityTaskPresenter),但并不总是可能或不希望每个组件只坚持一个组件一组功能(例如,对所有与任务相关的活动和依赖项坚持只有一个 TaskComponent)。

相反,在 Dagger 2 中,可通过模块实现可重用性,您可以非常轻松地换入和换出组件。在 Dagger 2 official documentation 中为可测试性组织模块的建议的约束下,您可以组织与您的功能一致的模块(例如,TaskModule 用于所有任务相关的依赖项)。然后,因为 Components 是如此的轻量级,你可以制作任意数量的组件来处理你的 Activity 的不同生命周期等等。还请记住,您可以使用 Module @interface.

中的 Class<?> [] includes() 方法组合模块

在您的特定场景中,您想要从 TaskDetailActivity 共享 Task 对象。如果您在 TaskDetailActivity 中持有对 Task 的引用,那么当 TaskDetailActivity 被销毁时,该引用将不再可用。虽然您可以尝试一些解决方案,将 Task 绑定到模块中,然后在应用程序范围级别维护对该模块的引用,但实际上您将在应用程序中执行与 UserScope 相同的操作-您链接的文章中的范围级别。使用 Dagger 2 在 Activity 之间共享 Task 对象的任何一种解决方案都必然涉及在应用范围级别维护对该对象的引用。

使用 Dagger 2 并不意味着 new 关键字或 Parcelables 的 serialization/deserialization 现在是错误的,所以如果您的第一直觉是使用 Intent沟通然后我会说你是对的。如果您需要比直接通信 Task 更强大的解决方案,那么您可以提取 TaskRepository 并在 Activity 之间传输包含 idIntent您要检索的 Task。事实上,一些 Google Android Architecture Blueprints 有这样的解决方案。