如何在Koin中提供基类?

时间:2019-07-09 11:23:38

标签: kotlin koin

例如,我有以下课程:

abstract class BaseClass()

class SpecificClass : BaseClass()

现在,我想通过SpecificClass依赖项注入来提供koin,但我也想在同一图中提供基类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引用?

2 个答案:

答案 0 :(得分:2)

您可以通过2种方式使用Koin进行操作

方法1

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

single {
    SpecificClass()
}

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

通过这种方式,每当您注入实例时,它都会相应地注入

方法2

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

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
    ...
}

答案 1 :(得分:0)

您不能注入抽象类。

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

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