![](/img/trans.png)
[英]how to inject dependency outside activity or fragment in Kodein or Koin?
[英]Koin how to inject outside of Android activity / appcompatactivity
Koin是一个新的轻量级 DI 库,可用于 Android 以及独立的 kotlin 应用程序。
通常你注入这样的依赖项:
class SplashScreenActivity : Activity() {
val sampleClass : SampleClass by inject()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
}
使用inject()
方法。
但是如何在 Activity 上下文不可用的地方(即 Activity之外)注入东西呢?
KoinComponent
可以派上用场。 在任何课程中,您都可以简单地:
class SampleClass : KoinComponent {
val a : A? by inject()
val b : B? by inject()
}
扩展KoinComponent
使您可以访问inject()
方法。
请记住,通常以通常的方式注入东西就足够了:
class SampleClass(val a : A?, val b: B?)
Koin 使用KoinComponent
接口为此提供了解决方案。 例如,如果您需要在存储库中获取一些依赖项,那么您可以简单地实现 KoinComponent 接口。 它使您可以访问各种 Koin 功能,例如get()
和inject()
。 仅当您无法重写构造函数以接受依赖项作为构造函数参数时,才使用 KoinComponent。
class MyRepository: Repository(), KoinComponent {
private val myService by inject<MyService>()
}
构造函数注入比这种方法更好。
例如,同样的事情可以通过以下方式实现:
class MyRepository(private val service: MyService): Repository() {
...
}
您可以在 koin 模块中添加用于实例化此类的定义:
val serviceModule = module {
...
factory { MyService() }
}
val repositoryModule = module {
...
factory { MyRepository(get<MyService>()) }
}
如果你不想实现任何接口,那么看看KoinComponent.inject()
是如何实现的,然后自己做一些类似的事情:
val foo by lazy { KoinPlatformTools.defaultContext().get().get<FooClass>() }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.