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

时间:2017-03-28 14:07:56

标签: dagger-2

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

现在我想知道我是否可以将某些活动组件设为另一个活动组件的subcomponent。例如,TaskDetailActivity有一个任务对象,并希望提供其他一些活动,例如TaskParticipantActivityTaskProgressActivity和一些片段。

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

更新:我的sistuation与本文http://frogermcs.github.io/dependency-injection-with-dagger-2-custom-scopes/中的UserScope案例类似,但是我可以保存在活动中,即TaskDetailActivity吗?

1 个答案:

答案 0 :(得分:3)

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

相反,在Dagger 2中,通过模块可以重新使用,您可以非常轻松地交换进出组件。在Dagger 2 official documentation中组织模块可测试性的建议的约束下,您可以组织与您的功能一致的模块(例如,TaskModule用于所有任务相关的依赖项。然后,因为组件非常轻量级,所以您可以根据自己的喜好来处理活动的不同生命周期等等。另请注意,您可以使用Class<?> [] includes() Module内的@interface方法撰写模块。

在您的特定情况下,您希望与Task共享TaskDetailActivity对象。如果您在Task中引用了TaskDetailActivity,则TaskDetailActivity被销毁时该引用将不再可用。虽然您可以尝试一些解决方案来保持模块中Task的绑定,然后在应用程序级别维护对该模块的引用,但您实际上应该与应用程序中的UserScope执行相同操作您链接的文章中的范围级别。使用Dagger 2在Activity之间共享Task对象的任何类型的解决方案都必然涉及在应用程序范围级别维护对象的引用。

使用Dagger 2并不意味着new关键字或Parcelables的序列化/反序列化现在是错误的,因此如果您的第一个直觉是使用Intent进行通信我会说你是对的。如果您需要比直接传达Task更强大的解决方案,那么您可以提取TaskRepository并在包含Intent id的活动之间传送Task你想要检索。实际上,Google Android Architecture Blueprints中的一些人有这样的解决方案。