它只是为了在模块中提供子类型吗?还是通过使用构造函数注入一些参数来直接的方法?
@Module
class TestModule() {
@Provides
@Singleton
fun provideDummy(): Dummy = DummyChild()
}
class MainActivity : AppCompatActivity() {
@Inject
lateinit var dummy: Dumy
override fun onCreate(savedInstanceState: Bundle?) {
...
}
...
}
这就是需要完成的方式。该模块提供可以注入的组件。
在上述情况下,TestModule
是可以提供DummyChild
的模块。如果DummyChild
的构造函数需要参数,则会变得复杂。在这种情况下,也需要注入参数。
@Module
class TestModule() {
@Provides
@Singleton
fun provideDummy(Context context): Dummy = DummyChild(context)
}
在上述情况下,还需要提供context
。您应该有一个裸露的方法可以提供上下文。
或通过使用构造函数注入一些参数?
是否有更直接的方法?
绝对!
@Module
class TestModule() {
@Provides
@Singleton
fun provideDummy(): Dummy = DummyChild() // bad, we construct it ourselves!
}
您应该让dagger关心对象的来源,因此调用构造函数通常不是一个好主意(除非这确实是您想要的(。绑定实现的正确方法是使用@Provides
方法并要求孩子直接返回或仅使用@Binds
注释,该注释有效地相同,但可能比@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
,因为这通常是DummyChild
的实现细节,而不是接口,但是如果您愿意,您当然仍然可以将其添加到该方法中。