确保 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
所以,我想要完成的是确保我在 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