如何在 Koin 中提供基数 class?

How to provide the base class in Koin?

例如我下面的 classes:

abstract class BaseClass()

class SpecificClass : BaseClass()

现在,我想通过 koin 依赖注入提供 SpecificClass,但我也想在同一张图中提供基础 class BaseClass

明确地说,我想做类似的事情:

class Someclass {
    ...
    private specificClass: SpecificClass by inject()
    ...
}

class Someclass {
    ...
    private baseClass: BaseClass by inject() 
    // where this BaseClass is just the the same instace of the SpecificClass in the dependency graph
    ...
}

我如何让我的模块做到这一点?如何将实现实例注入 baseClass 引用?

你不能注入抽象 classes.

为了注入 class,它必须是可实例化的和抽象的 classes 不是。

要使用 Koin 注入 SpecificClass,您需要创建一个模块:

val appModule = module {
    single {
        SpecificClass()
    }
}

在你的应用程序中初始化它class:

class MyApplication : Application() {
  override fun onCreate(){
    super.onCreate()
    // start Koin!
    startKoin {
      // declare used Android context
      androidContext(this@MyApplication)
      // declare modules
      modules(appModule)
    }
  } 
} 

并在 activity/fragment

中使用注入委托
class MyActivity() : AppCompatActivity() {

    val specificClass : SpecificClass by inject()
}

您可以通过两种方式使用 Koin

方法一

你可以像这样为它们创建依赖关系

single {
    SpecificClass()
}

single<BaseClass> {
    get<SpecificClass>()
}

这样,每当你注入一个实例时,它就会被相应地注入

方法二

您可以像这样使用命名依赖项

single("BaseClassImpl") {
        SpecificClass()
    }

当你想注入它时,像这样为该依赖项提供密钥:

class Someclass {
    ...
    private specificClass: SpecificClass by inject("BaseClassImpl")
    ...
}

class Someclass {
    ...
    private baseClass: BaseClass by inject("BaseClassImpl") 
    // where this BaseClass is just the the same instace of the SpecificClass in the dependency graph
    ...
}