Dagger 2 Singleton vs Real Singleton

时间:2016-09-17 21:06:46

标签: android dagger-2

我正在尝试在我的项目中使用匕首2。 Dagger提供了一个创建单例的好方法,我在项目中有一些,但是Dagger为每个@Singleton对象创建了一个新的对象图,每个新的容器,所以我们必须在应用程序级别创建组件,我们应该提供应用程序使用单身的类,这看起来不太好:(。 问题是:我应该保留我的旧单身人士吗?或者我应该使用匕首?

1 个答案:

答案 0 :(得分:3)

Dagger是管理单身人士的一种更好的方式,部分原因是你不必担心在单元测试中如何替换这些单身人士:你的单身人士将通过你可以控制和覆盖单位的方式注入测试(即构造函数参数和可访问字段)。

  

Dagger为每个@Singleton对象的每个新容器创建一个新的对象图,因此我们必须在应用程序级别创建组件

如果您需要应用程序级单例, 希望在应用程序的生命周期中保留相同的组件实例,而不是为每个新的"容器创建一个新的组件实例#34 ;.该组件将包含并提供单例,因此您不应该在应用程序中需要多个活动对象图。如果某个外部创建者(例如Android或servlet引擎)在Dagger之外自己创建对象,这可能意味着您需要将Dagger组件保存在单例持有者(可能是线程安全的公共静态字段)中你为你的老单身人所做的事;这应该更容易理解和维护,因为您可以通过Dagger提供尽可能多的单身,并且只担心组件本身的一个外部管理单例。

作为替代方案,您可以完全按原样保留旧单例,并在模块中编写@Provides方法,以便在Dagger创建的对象请求它们时检索这些单例实例。这样您就可以随时随地创建新的对象图,并且您的单身人士仍然可以表现为单身。不过,我要注意这一点,因为在这一点上,你的单身人士可以在你的应用程序中以两种不同的方式访问,只有那些由Dagger创建或Dagger管理的人才会在测试中被轻易覆盖;这可能令人困惑,难以管理。