kos*_*cki 10 android dependency-injection inversion-of-control kotlin koin
Koin是一个全新的轻量级DI库,可用于Android以及独立的kotlin应用程序.
通常你注入这样的依赖:
class SplashScreenActivity : Activity() {
val sampleClass : SampleClass by inject()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
}
Run Code Online (Sandbox Code Playgroud)
用这个inject()方法.
但是如果在Activity上下文不可用的地方(例如活动之外)注入东西呢?
kos*_*cki 27
还有就是KoinComponent它来救援.在任何课程中你都可以简单地:
class SampleClass : KoinComponent {
val a : A? by inject()
val b : B? by inject()
}
Run Code Online (Sandbox Code Playgroud)
扩展KoinComponent使您可以访问inject()方法.
请记住,通常以通常的方式注入东西就足够了:
class SampleClass(val a : A?, val b: B?)
Run Code Online (Sandbox Code Playgroud)
Koin使用该KoinComponent界面为此提供了解决方案。例如,如果您需要在存储库中获取一些依赖关系,则只需实现KoinComponent接口。它使您可以访问各种Koin功能,例如get()和inject()。仅在无法重写构造函数以将依赖项作为构造函数参数接受时,才使用KoinComponent。
class MyRepository: Repository(), KoinComponent {
private val myService by inject<MyService>()
}
Run Code Online (Sandbox Code Playgroud)
构造函数注入比这种方法更好。
例如,可以通过以下方法实现相同的目的:
class MyRepository(private val service: MyService): Repository() {
...
}
Run Code Online (Sandbox Code Playgroud)
您可以在koin模块中添加实例化此类的定义:
val serviceModule = module {
...
factory { MyService() }
}
val repositoryModule = module {
...
factory { MyRepository(get<MyService>()) }
}
Run Code Online (Sandbox Code Playgroud)
如果您不想实现任何接口,那么只需看看如何KoinComponent.inject()实现并自己做类似的事情:
val foo by lazy { KoinPlatformTools.defaultContext().get().get<FooClass>() }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3916 次 |
| 最近记录: |