依赖注入

我试图不去增加很复杂的结构代码,保持简洁可测试性的代码和好的实践,我想我应该用Kotlin从其它方面去简化代码。如果你想了解一些控制反转或者依赖注入的话题,你可以查看我关于Android中使用Dagger注入的一系列文章。第一篇文章有关于他们这个团队的简单描写。

一种简单的方式,如果我们想拥有一些独立于其他类的类,这样更容易测试,并编写代码,易于扩展和维护,这时我们需要使用依赖注入。我们不去在类内部去实例化,我们在其它地方提供它们(通常通过构造函数)或者实例化它们。用这种方式,我们可以用其它的对象来替代他们。比如可以实现同样的接口或者在tests中使用mocks。

但是现在,这些依赖必须要在某些地方被提供,所以依赖注入由提供合作者的类组成。这些通常使用依赖注入器来完成。Dagger可能是Android上最流行的依赖注入器。当然当我们提供依赖有一定复杂性的时候是个很好的替代品。

但是最小的替代是可以在这个构造函数中使用默认值。我们可以给构造函数的参数通过分配默认值的方式提供一个依赖,然后在不同的情况下提供不同的实例。比如,在我们的ForecastDbHelper我们可以用更智能的方式提供一个context:

  1. class ForecastDbHelper(ctx: Context = App.instance) :
  2. ManagedSQLiteOpenHelper(ctx, ForecastDbHelper.DB_NAME, null,
  3. ForecastDbHelper.DB_VERSION) {
  4. ...
  5. }

现在我们有两种方式来创建这个类:

  1. val dbHelper1 = ForecastDbHelper() // 它会使用 App.instance
  2. val dbHelper2 = ForecastDbHelper(mockedContext) // 比如,提供给测试tests

我会到处使用这个特性,所以我在解释清楚之后再继续往下。我们已经有了表,所以是时候开始对它们增加和请求了。但是在这之前,我想先讲讲结合和函数操作符。别忘了查看代码库找到最新的代码。