如何在 Koin 中提供基类?
Posted
技术标签:
【中文标题】如何在 Koin 中提供基类?【英文标题】:How to provide the base class in Koin? 【发布时间】:2019-11-18 22:41:50 【问题描述】:例如我下面的类:
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
...
我该如何做我的模块来做到这一点?如何将实现实例注入基类引用?
【问题讨论】:
【参考方案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()
【讨论】:
是的,我明白这一点,但如果我也想提供SpecificClass
为 BaseClass
。以上是关于如何在 Koin 中提供基类?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Android/Kotlin App 上通过 Koin 注入在 BaseActivity 中初始化/注入通用 ViewModel
Koin在KMM与Android Jetpack Compose中的应用
Koin如何注入Android活动/ appcompatactivity之外