Koin如何注入Android活动/ appcompatactivity之外

kos*_*cki 10 android dependency-injection inversion-of-control kotlin koin

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

通常你注入这样的依赖:

class SplashScreenActivity : Activity() {

    val sampleClass : SampleClass by inject()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }
}
Run Code Online (Sandbox Code Playgroud)

用这个inject()方法.

但是如果在Activity上下文不可用的地方(例如活动之外)注入东西呢?

kos*_*cki 27

还有就是KoinComponent它来救援.在任何课程中你都可以简单地:

class SampleClass : KoinComponent {

    val a : A? by inject()
    val b : B? by inject()
}
Run Code Online (Sandbox Code Playgroud)

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

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

class SampleClass(val a : A?, val b: B?)
Run Code Online (Sandbox Code Playgroud)


har*_*min 6

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

class MyRepository: Repository(), KoinComponent {
  private val myService by inject<MyService>()
}
Run Code Online (Sandbox Code Playgroud)

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

例如,可以通过以下方法实现相同的目的:

class MyRepository(private val service: MyService): Repository() {
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

val serviceModule = module {
    ...

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

    factory { MyRepository(get<MyService>()) }
}
Run Code Online (Sandbox Code Playgroud)

  • KoinComponent 的方法称为字段注入。以下是构造函数注入更好的几个原因: 1. 更简单:您的类只关心它需要什么依赖项,而不关心谁满足它们。2. 更健壮:类的实例在构造后就处于一致状态,而不是在字段注入完成后。3. 更容易测试:在构造函数中声明依赖项可以更轻松地在测试时提供模拟。 (8认同)

Mar*_*ark 5

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

val foo by lazy { KoinPlatformTools.defaultContext().get().get<FooClass>() }
Run Code Online (Sandbox Code Playgroud)