Dagger 2 Singleton 与 Real Singleton

Met*_*lel 5 android dagger-2

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

Jef*_*ica 3

Dagger 是管理单例的更好方法,部分原因是您无需担心在单元测试期间如何替换这些单例:您的单例将通过您可以在单元测试中控制和覆盖的方式(即构造函数参数)注入和可访问字段)。

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

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

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