匕首2 Singleton vs Real Singleton

问题描述:

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

匕首是一个更好的方式来管理单身人士,部分原因是你不必担心在单元测试中如何替换这些单例:你的单例将通过意味着你可以在单元测试(即构造函数参数和可访问字段)中进行控制和重写的方式来注入。

匕首创建@Singleton对象,以便我们在应用层面创建组件为每个每个新容器的新对象图

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

作为一种替代方法,您可以将您的旧单例完全保留为您的单例,并在模块中编写@Provides方法以在您的Dagger创建的对象请求它们时检索这些单例实例。这将允许您随时随地创建一个新的对象图,并且您的单身人员仍将表现为单身人士。不过,我会提醒你不要这样做,因为在那时你的单身人士可以在你的应用程序中以两种不同的方式访问,而且只有那些由Dagger创建或者Dagger管理的单身人士在测试中很容易被覆盖;这可能会令人困惑和难以管理。