Kotlin使用Kodein进行依赖注入

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() 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() with singleton {User.instance }
}

5.使用,

class MainActivity : AppCompatActivity(), KodeinAware {

    private val parentKodein by closestKodein()

    override val kodein: Kodein = Kodein.lazy {
        extend(parentKodein)
        //不用重复导入同一个,Binding bind() 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()
    }
}

还有一些其他的声明周期操作之类,,,自行百度。

你可能感兴趣的:(Kotlin使用Kodein进行依赖注入)