Koin如何在Android活动/ appcompatactivity之外注入

时间:2018-04-03 11:50:13

标签: android dependency-injection kotlin inversion-of-control koin

Koin 是一个全新的轻量级DI库,可用于Android以及独立的kotlin应用。

通常你会注入这样的依赖:

class SplashScreenActivity : Activity() {

    val sampleClass : SampleClass by inject()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }
}

使用inject()方法。

但是如果在没有活动上下文的地方注入东西,例如在活动之外呢?

3 个答案:

答案 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()
    }