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())
}

声明依赖项

现在,让我们用HelloServiceKoin模块组装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()
    }
}

results matching ""

    No results matching ""