如何在 Koin 中提供基类?

Posted

技术标签:

【中文标题】如何在 Koin 中提供基类?【英文标题】:How to provide the base class in Koin? 【发布时间】:2019-11-18 22:41:50 【问题描述】:

例如我下面的类:

abstract class BaseClass()

class SpecificClass : BaseClass()

现在,我想提供 SpecificClasskoin 依赖注入,但我还想在同一个图中提供基类 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
    ...

我该如何做我的模块来做到这一点?如何将实现实例注入基类引用?

【问题讨论】:

【参考方案1】:

你可以通过两种方式使用 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
    ...

【讨论】:

【参考方案2】:

你不能注入抽象类。

为了注入一个类,它必须是可实例化的,而抽象类不是。

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

val appModule = module 
    single 
        SpecificClass()
    

在您的应用程序类中初始化它:

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

并在您的活动/片段中使用注入委托

class MyActivity() : AppCompatActivity() 

    val specificClass : SpecificClass by inject()

【讨论】:

是的,我明白这一点,但如果我也想提供 SpecificClassBaseClass

以上是关于如何在 Koin 中提供基类?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Room MVVM 架构中实现 Koin 依赖注入

如何在 Android/Kotlin App 上通过 Koin 注入在 BaseActivity 中初始化/注入通用 ViewModel

Koin在KMM与Android Jetpack Compose中的应用

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

如何使用 Koin 依赖注入 (Kotlin) 检索与给定类型匹配的所有实例

使用 koin 作为 Android 注入工具,真香