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

时间:2017-02-10 11:27:59

标签: android dagger-2 scoping

所以,我想要完成的是确保Dagger2中每个范围只有一个实例。

默认的Singleton范围已经以这种方式工作。无论你注入多少个相同对象的地方,我们都称之为GlobalInstance,构造它的方法GlobalInstance provideGlobalInstance()将只调用一次。

另一方面,如果我定义自定义范围,例如@SessionScope,并且在某些SessionModule内,我创建方法User provideUser(),该方法(并因此new User()我注入User时会多次调用构造函数。无论我每次都使用相同的模块实例,我的代码中每个User provideUser()都会调用@Inject User mUser,因此会生成多个实例,而不是一个范围有限的"单例&# 34。

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

1 个答案:

答案 0 :(得分:1)

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

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

  • @Provides @SessionsScope - 提供“会话单身人士”(稍后会详细介绍)
  • @Provides - 为每次注射提供新对象

请注意,当我们谈论Dagger时,术语“单身人士”有些含糊不清,因此我更喜欢使用术语“范围对象”。当第一次使用Dagger注入作用域对象时,该组件会缓存其实例,并在每次后续注入时返回相同的组件。

有关详情,请阅读以下文章:Android Dagger 2 Scopes Demistified