连接.kt
interface Connection {
fun connect(endpoint:String)
}
HttpsConnection.kt
class HttpsConnection @Inject constructor(): Connection {
override fun connect(endpoint: String) {
PrintUtils.printLog("HttpsConnection made")
}
}
HttpsConnectionModule.kt
@Module
@DisableInstallInCheck
class `HttpsConnectionModule` {
@Provides
fun provideHttpsConnection() : Connection {
return HttpsConnection()
}
}
ConnectionComponent.kt
@Component(modules = [HttpsConnectionModule::class])
interface ConnectionComponent {
fun inject(activity: IntroScopeDemoActivity)
}
IntroScopeDemoActivity.kt
class IntroScopeDemoActivity : AppCompatActivity() {
//@Inject lateinit var conn : HttpsConnection
//@Inject lateinit var connInterface : Connection
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_intro_scope_demo)
val comp = DaggerConnectionComponent.builder().build()
comp.inject(this@IntroScopeDemoActivity)
println("Injection completed")
}
}
发生了什么事
@Inject lateinit var conn : HttpsConnection
如果我用上面的代码来注入实现,就可以了
但是如果我使用下面的行来注入接口,它不起作用
@Inject lateinit var connInterface : Connection
错误:
/Users/devrath/Documents/Projects/Github/droid-di-use-cases/frameworks/hilt/code/app/build/tmp/kapt3/stubs/debug/com/istudio/di/modules/dagger/demos/scopes/introdemo/components/ConnectionComponent.java:9: error: [Dagger/MissingBinding] java.sql.Connection cannot be provided without an @Provides-annotated method.
public abstract interface ConnectionComponent {
^
java.sql.Connection is injected at
com.istudio.di.modules.dagger.demos.scopes.introdemo.IntroScopeDemoActivity.connInterface
com.istudio.di.modules.dagger.demos.scopes.introdemo.IntroScopeDemoActivity is injected at
com.istudio.di.modules.dagger.demos.scopes.introdemo.components.ConnectionComponent.inject(com.istudio.di.modules.dagger.demos.scopes.introdemo.IntroScopeDemoActivity)
问题:
是否可以将接口注入变量中,因为接口具有定义的实现并作为模块附加在组件中?
IntroScopeDemoActivity
中检查进口情况。看起来 @Inject lateinit var connInterface : Connection
来自 java.sql.Connection
而不是您的 Connection
界面。@Provides
,您可以使用 @Binds
代替:@Binds
fun bindHttpsConnection(impl: HttpsConnection): Connection
它的工作原理就像您已经将
HttpsConnection
添加到图表中一样(使用 @Inject constructor
),并且使用 @Binds
,您只需将实现“映射”到接口即可。
由于该方法只有签名而没有实现体,因此
HttpsConnectionModule
不能是常规类,但可以是接口。