确保 Dagger2 中每个范围只有一个实例

Ensuring only one instance per scope in Dagger2

所以,我想要完成的是确保我在 Dagger2 中的每个作用域只有一个实例。

默认单例作用域已经可以这样工作了。不管你在多少地方注入同一个对象,我们就叫它GlobalInstance,构造它的方法GlobalInstance provideGlobalInstance()只会被调用一次。

另一方面,如果我定义自定义作用域,例如 @SessionScope 并在某些 SessionModule 中创建方法 User provideUser(),该方法(因此,new User() constructor) 将在我注入时被调用多次 User。无论我是否每次都使用相同的模块实例,我的代码中的每个 @Inject User mUser 都会调用 User provideUser(),从而产生多个实例,而不是一个范围有限的 "singleton"。

是否有一些明确的方法来实现它,使用常规 Dagger api。一种方法是在模块中使用惰性吸气剂 class,但这不是很干净的方法。

请注意,@Singleton 范围在功能上等同于您定义的任何其他自定义范围。

这意味着您可以在 SessionModule 中使用两种风格的 @Provides 方法:

  • @Provides @SessionsScope - 提供 "session singletons"(稍后详细介绍)
  • @Provides - 在每次注入时提供新对象

请注意,当我们谈论 Dagger 时,术语 "singleton" 有一些歧义,因此我更喜欢使用术语 "scoped objects"。当第一次使用 Dagger 注入作用域对象时,组件会缓存它的实例,并且 returns 它会在由相同组件执行的每次后续注入中缓存。

有关详细信息,您可以阅读此 post:Android Dagger 2 Scopes Demistified