Dagger 2 单例 vs 真实单例

Dagger 2 Singleton vs Real Singleton

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

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

Dagger creates a new object graph with every new container for each @Singleton object so we have to create the component in the application level

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

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