用 Java 进行 Android 开发的话,依赖注入这一块通常使用 Dagger ,转用 Kotlin 以后有更多的选择,Kodein 是个不错的库, 4.0 5.0 都使用过了,相对于 Dagger 有不少好处。android
KodeinAware
并绑定依赖class MyApp : Application(), KodeinAware {
override val kodein = Kodein.lazy {
/* bindings */
}
}
复制代码
closestKodein
方法获取class MyApp : Application(), KodeinAware {
//实例化 Application 级的 kodein 经过 DSL 绑定 module
override val kodein = Kodein.lazy {
//导入预设的 android 组件
import(androidModule(this@MainApplication))
//绑定或者导入自定义依赖
}
}
复制代码
Kodein
class MyApp : Application(), KodeinAware {
//实例化 Application 级的 kodein 经过 DSL 绑定 module
override val kodein = Kodein.lazy {
//导入预设的 android 组件
import(androidModule(this@MainApplication))
//绑定或者导入自定义依赖
}
}
复制代码
Kodein
而后经过 Kodein
加载依赖class MyActivity : Activity(), KodeinAware {
override val kodein by closestKodein()
val ds: DataSource by instance()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
ds.connect()
/* ... */
}
}
复制代码
一样能够避免依赖死循环(除非加载依赖的方式只有 instance)bash
class MyActivity : Activity(), KodeinAware {
override val kodein by closestKodein()
override val kodeinTrigger = KodeinTrigger()
val ds: DataSource by instance()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
kodeinTrigger.trigger()
/* ... */
}
}
复制代码
class MyController(androidContext: Context) : KodeinAware {
override val kodein by androidContext.closestKodein()
override val kodeinContext = kcontext(androidContext)
val inflater: LayoutInflater by instance()
}
复制代码
Kodein
继承自 Application 级class MyActivity : Activity(), KodeinAware {
private val _parentKodein by closestKodein()
override val kodein: Kodein = Kodein {
extend(_parentKodein)
/* activity specific bindings */
}
}
复制代码
class MyActivity : Activity(), KodeinAware {
private val _parentKodein by closestKodein()
override val kodein: Kodein by retainedKodein {
extend(_parentKodein)
/* activity specific bindings */
}
}
复制代码
//每一个 Activity 一个单例
val kodein = Kodein {
bind<Controller>() with scoped(androidScope<Activity>()).singleton { ControllerImpl(context) }
}
复制代码
val kodein = Kodein {
bind<Controller>() with scoped(activityRetainedScope).singleton { ControllerImpl() }
}
复制代码
() -> T
() → T
() -> T
(A) -> T
(A) -> T
val kodein = Kodein {
bind<Die>() with ...
bind<Die>(tag = "DnD10") with ...
bind<Die>(tag = "DnD20") with ...
}
复制代码
OutOfMemoryException
以前 JVM 执行 GCval kodein = Kodein {
bind<Map>() with refSingleton(ref = softReference) { WorldMap() }
bind<Client>() with refSingleton(ref = weakReference) { id -> clientFromDB(id) }
}
复制代码
class Die(private val random: Random, private val sides: Int) {
/*...*/
}
val kodein = Kodein {
bind<Die>() with singleton { Die(instance(), instance(tag = "max")) }
bind<Random>() with provider { SecureRandom() }
constant(tag "max") with 5
}
复制代码