使用Dagger 2注入一类子类型的最佳方法是什么?

时间:2018-02-19 08:38:15

标签: android dagger-2 dagger

是否只是在模块中提供子类型?或者是否有更直接的方法,例如通过使用构造函数注入一些参数?

@Module
class TestModule() {

  @Provides
  @Singleton
  fun provideDummy(): Dummy = DummyChild()

}

class MainActivity : AppCompatActivity() {
    @Inject
    lateinit var dummy: Dumy

    override fun onCreate(savedInstanceState: Bundle?) {
       ...
    }

    ...
}

2 个答案:

答案 0 :(得分:0)

这是如何完成的。该模块提供可注入的组件。

在上述情况中,TestModule是可以提供DummyChild的模块。如果DummyChild的构造函数需要参数,那就变得复杂了。在这种情况下,也需要注入参数。

@Module
class TestModule() {

@Provides
@Singleton
fun provideDummy(Context context): Dummy = DummyChild(context)
}

在上述情况下,还需要提供context。您应该有一个可以提供Context的公开Provide方法。

答案 1 :(得分:0)

  

或者是否有更直接的方法,例如使用构造函数注入一些参数?

绝对!

@Module
class TestModule() {

  @Provides
  @Singleton
  fun provideDummy(): Dummy = DummyChild() // bad, we construct it ourselves!

}

你应该让Dagger关心对象的来源,所以调用构造函数通常不是一个好主意(除非这真的是你想要的)。绑定实现的正确方法是使用@Provides方法并请求子进程,直接返回它,或者只使用@Binds注释,该注释将有效地执行,但可能比{{更优化1}}。

@Provides

请注意,我从方法中删除了@Module class TestModule() { @Provides fun provideDummy(implementation : DummyChild): Dummy = implementation // better! // or with @Binds @Binds abstract fun provideDummy(implementation : DummyChild): Dummy // also good } @Singleton class DummyChild @Inject constructor() ,因为这通常是@Singleton的实现细节,而不是接口,但如果您愿意,您当然可以将其添加到方法中这样做。