5

例如我下面的类:

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 引用?

4

2 回答 2

5

您可以通过 2 种方式使用 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
    ...
}
于 2019-07-10T06:24:31.327 回答
0

你不能注入抽象类。

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

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

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()
}
于 2019-07-09T12:04:47.063 回答