Koin依赖注入
编写Kotlin应用程序,并使用Koin注入和检索组件。
安装程序
首先,检查是否添加了koin-core依赖项,如下所示:
// Add Maven Central to your repositories if needed
repositories {
mavenCentral()
}
dependencies {
// Koin for Kotlin apps
compile "io.insert-koin:koin-core:$koin_version"
// Testing
testCompile "io.insert-koin:koin-test:$koin_version"
}
应用程序
在我们的小应用程序中,我们需要有两个组件:
- HelloMessageData-保留消息数据
- HelloService-使用和显示HelloMessageData中的数据
- HelloApplication-检索和使用HelloService
数据保持器
让我们创建一个HelloMessageData数据类来保存数据:
/**
* A class to hold our message data
*/
class HelloMessageData {
val message: String = "Hello Koin!"
}
服务
让我们创建一个服务来显示HelloMessageData中的数据。让我们编写HelloServiceImpl类及其接口HelloService:
/**
* Hello Service - interface
*/
interface HelloService {
fun hello(): String
}
/**
* Hello Service Impl
* Will use HelloMessageData data
*/
class HelloServiceImpl(private val helloMessageData: HelloMessageData) : HelloService {
override fun hello() = "Hey, ${helloMessageData.message}"
}
应用程序类
要运行HelloService组件,我们需要创建一个运行时组件。让我们编写一个HelloApplication类,并用KoinComponent接口标记它。这将允许我们稍后使用by inject()函数来检索组件
/**
* HelloApplication - Application Class
* use HelloService
*/
class HelloApplication : KoinComponent {
// Inject HelloService
val helloService by inject<HelloService>()
// display our data
fun sayHello() = println(helloService.hello())
}
声明依赖项
现在,让我们用HelloService和Koin模块组装HelloMessageData。
Classical DSL方式:
val helloModule = module {
single { HelloMessageData() }
single { HelloServiceImpl(get()) as HelloService }
}
我们将每个组件声明为单个实例。
- single{HelloMessageData()}:声明HelloMessageData实例的singleton
- single{HelloServiceImpl(get())as HelloService}:使用注入的HelloMessageData实例构建HelloServiceImpl,声明了HelloService的singleton。
or Constructor DSL方式:
val helloModule = module {
singleOf(::HelloMessageData)
singleOf(::HelloServiceImpl) { bind<HelloService>() }
}
- singleOf(::HelloMessageData):声明HelloMessageData实例的singleton
- singleOf(::HelloServiceImpl){bind
()} :使用注入的HelloMessageData实例构建HelloServiceImpl,声明了HelloService的singleton
使用案例:
class MyApp : Application() {
override fun onCreate() {
super.onCreate()
startKoin {
// use Koin logger
printLogger()
// declare modules
modules(helloModule)
}
HelloApplication().sayHello()
}
}