是否只是在模块中提供子类型?或者是否有更直接的方法,例如通过使用构造函数注入一些参数?
@Module
class TestModule() {
@Provides
@Singleton
fun provideDummy(): Dummy = DummyChild()
}
class MainActivity : AppCompatActivity() {
@Inject
lateinit var dummy: Dumy
override fun onCreate(savedInstanceState: Bundle?) {
...
}
...
}
答案 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
的实现细节,而不是接口,但如果您愿意,您当然可以将其添加到方法中这样做。