美文网首页
Kotlin使用Kodein进行依赖注入

Kotlin使用Kodein进行依赖注入

作者: Coding_530 | 来源:发表于2019-06-12 18:19 被阅读0次

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

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

    相关文章

      网友评论

          本文标题:Kotlin使用Kodein进行依赖注入

          本文链接:https://www.haomeiwen.com/subject/swkrfctx.html