38

Koin是一个新的轻量级 DI 库,可用于 Android 以及独立的 kotlin 应用程序。

通常你注入这样的依赖:

class SplashScreenActivity : Activity() {

    val sampleClass : SampleClass by inject()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }
}

inject()方法。

但是在 Activity 上下文不可用的地方(即在 Activity 之外)注入东西呢?

4

3 回答 3

65

KoinComponent来救援的。在任何课程中,您都可以简单地:

class SampleClass : KoinComponent {

    val a : A? by inject()
    val b : B? by inject()
}

扩展KoinComponent使您可以访问inject()方法。

请记住,通常以通常的方式注入东西就足够了:

class SampleClass(val a : A?, val b: B?)
于 2018-04-03T11:50:13.123 回答
23

Koin 使用该KoinComponent界面为此提供了解决方案。例如,如果您需要在存储库中获取一些依赖项,那么您可以简单地实现 KoinComponent 接口。它使您可以访问各种 Koin 功能,例如get()inject()。仅当您无法重写构造函数以接受依赖项作为构造函数参数时才使用 KoinComponent。

class MyRepository: Repository(), KoinComponent {
  private val myService by inject<MyService>()
}

构造函数注入比这种方法更好。

例如,同样的事情可以通过以下方式实现:

class MyRepository(private val service: MyService): Repository() {
    ...
}

您可以在 koin 模块中添加用于实例化此类的定义:

val serviceModule = module {
    ...

    factory { MyService() }
}
val repositoryModule = module {
    ...

    factory { MyRepository(get<MyService>()) }
}
于 2019-04-14T12:22:02.873 回答
6

如果您不想实现任何接口,那么只需看看是如何KoinComponent.inject()实现的并自己做类似的事情:

val foo by lazy { KoinPlatformTools.defaultContext().get().get<FooClass>() }
于 2020-02-05T17:48:33.430 回答