1.依赖:
// 基础组件
implementation 'org.kodein.di:kodein-di-generic-jvm:5.2.0'
// Android扩展组件
implementation 'org.kodein.di:kodein-di-framework-android-core:5.2.0'
// support扩展组件,我的项目中用到了v4包的Fragment,因此我需要它
implementation 'org.kodein.di:kodein-di-framework-android-support:5.2.0'
2.application注册
open class MyApplication : Application(), KodeinAware {
// 在一个Android项目中,很多依赖都需要保持单例,这样能够保证合理的资源规划,
/ / 比如,Retrofit的实例化,比如Gson对象的实例化,这里我们直接在Application中进行配置:
//KodeinAware是一个接口,它意味着,实现该接口的对象都会持有一个Kodein容器:
//MyApplication 实现了KodeinAware接口,并实例化了一个Kodein容器,
// 接下来我们要做的,就是把对应的依赖装进Kodein容器中。
override val kodein: Kodein = Kodein.lazy {
bind<Context>() with singleton { this@MyApplication }/* bindings */
import(androidModule(this@MyApplication)) //导入预设的 android 组件
import(moduleActivityManager)//绑定或者导入自定义依赖
}
}
3.定义一个需要全局的单列类,例如Retrofit。或者Gson,okhttp.....
写一个UserManager.kt文件,定义User 类。
class User private constructor() {
private object SingletonHolder {
val holder = User()
}
companion object {
val instance = SingletonHolder.holder
}
fun getName(): String {
return "530503"
}
}
4.创建一个model.kt文件,定义需要注入的模板
const val MODULE_TAG_USERMANAGER = "module_tag_user"
val moduleUserManager = Kodein.Module(MODULE_TAG_USERMANAGER) {
bind<User>() with singleton {User.instance }
}
5.使用,
class MainActivity : AppCompatActivity(), KodeinAware {
private val parentKodein by closestKodein()
override val kodein: Kodein = Kodein.lazy {
extend(parentKodein)
//不用重复导入同一个,Binding bind<ActivityManager>() with ? { ? } must not override an existing binding.
//如果在Application 导入了,在其他地方就不用再次导入了
import(moduleUserManager)
}
private val user: User by instance()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
txt.text = user.getName()
}
}
还有一些其他的声明周期操作之类,,,自行百度。
网友评论