Koin 是一个全新的轻量级DI库,可用于Android以及独立的kotlin应用。
通常你会注入这样的依赖:
class SplashScreenActivity : Activity() {
val sampleClass : SampleClass by inject()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
}
使用inject()
方法。
但是如果在没有活动上下文的地方注入东西,例如在活动之外呢?
答案 0 :(得分:16)
有KoinComponent
来救援。在任何课程中你都可以简单地说:
class SampleClass : KoinComponent {
val a : A? by inject()
val b : B? by inject()
}
扩展KoinComponent
可让您访问inject()
方法。
请记住,通常它足以以通常的方式注入东西:
class SampleClass(val a : A?, val b: B?)
答案 1 :(得分:0)
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>()) }
}
答案 2 :(得分:0)
如果您不想实现任何接口,那么只需看看KoinComponent.inject()
的实现方式并自己做类似的事情即可:
override func viewDidLoad() {
super.viewDidLoad()
//set up your view controller here.
NotificationCenter.default.addObserver(self, selector: #selector(self.appMovedToForeground), name: UIApplication.willEnterForegroundNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(self.appMovedToBackground), name: UIApplication.didEnterBackgroundNotification, object: nil)
}
@objc func appMovedToForeground() {
self.noteTextView.becomeFirstResponder()
}
@objc func appMovedToBackground() {
self.noteTextView.resignFirstResponder()
}