Kodein使用记录

项目工程中之前用的4.1.0版本的Kodein.最近将Kodein升级到6.0.0.主要是工程现在没有适配AndroidX,Kodein6.0以上只找到AndroidX版本的,官网也没有什么历史版本索引,GitHub上文档也使用页面是白的,因此这次先升级到6.0.0。Kodein4.+到6.0的变化比较大,6.0以后变化就不是很大了这里这里记录以下6.0的新的语法调用。

配置依赖

配置依赖

implementation "org.kodein.di:kodein-di-core-jvm:6.0.0"
implementation "org.kodein.di:kodein-di-generic-jvm:6.0.0"
implementation "org.kodein.di:kodein-di-framework-android-support:6.0.0"

配置仓库

repositories {
        google()
        jcenter()
        maven { url 'https://dl.bintray.com/kodein-framework/Kodein-DI/' }
        
    }

推荐的方式:

class App() : Application(), KodeinAware {

    override val kodein = Kodein.lazy {
        bind<Context>() with singleton { this@App }
        bind<AppInfo>() with singleton { appInfo }
        import(appModule(applicationContext))
    }

    override fun onCreate() {
        super.onCreate()
    }

}
abstract class InjectActivity :AppCompatActivity(),KodeinAware {

    private val appKodein by closestKodein()

    override val kodein: Kodein by retainedKodein {
        // 把app中的注入包含进来
        extend(appKodein)
        import(baseActivityModule(this@InjectActivity), allowOverride = true)
    }

    /**
     * Optional to override, if your activity needs specific DI.
     */
    open fun activityModule() = Kodein.Module("activityModule") {

    }

}
fun appModule(appContext: Context) = Kodein.Module("appModule") {
  bind<Navigator>() with provider { PhotoAppNavigator(instance()) }
  bind<Logger>() with singleton { AndroidLogger() }
  bind<Invoker>() with factory{a:String->UseCaseInvoker()}
  bind<Invoker>() with factory{a:String,b:Int,c:String,d:String,e:String->UseCaseInvoker()}

  import(httpAppModule())
  import(photosAppModule())
}

使用的时候:

以下三种方式是等效的
val appinfo = kodein.direct.Instance(TT(AppInfo::class.java))
val appinfo1 by kodein.instance<AppInfo>()
val appinfo2 = kodein.direct.instance<AppInfo>()

factory传参使用如下:
val invoker1 = kodein.direct.factory<String, Invoker>().invoke("我是参数")
val invoker2 = kodein.direct.factory2<String,String, Invoker>().invoke("我是参数1","我是参数2")
// 同理三四五

下面2个也是等效的
val navigator = kodein.direct.provider<Navigator>()
val navigator1 by kodein.provider<Navigator>()

特殊的注入这里做下记录
bind<Invoker>() with multiton { dbName: String ->
    UseCaseInvoker(dbName)
  }
对应的获取方法
val logger: Logger = kodein.direct.Instance(TT(String::class),TT(Logger::class),arg = "args")
或者
val logger2 = kodein.direct.factory<String, Logger>().invoke("我是参数")
// 看源发现内部是通过binding的类型来区分返回的,所以这里2种方式是没什么区别的

除了上面的方式,还有另外2中懒加载方式初始化注入

class App() : Application(){

    override fun onCreate() {
        initDI()
        super.onCreate()
    }


    private fun initDI() {
        KodeinConfig.addConfig {
            bind<Context>() with singleton { this@App }
            bind<AppInfo>() with singleton { appInfo }
        }
    }


    val appInfo by lazy {
        AppInfo(
            BuildConfig.APPLICATION_ID,
            metaData("CHECK_VERSION_ID", ""),
            Device.PHONE
        )
    }

}

方式一:

val kodeinExt =  LateInitKodein()

object KodeinConfig {

    fun addConfig(config: Kodein.Builder.() -> Unit) {
        kodeinExt.baseKodein = Kodein.lazy {
                import(Kodein.Module("config",init = config))
                bind<Logger>() with singleton { AndroidLogger() }
        }
    }
}

方式二:

val kodeinExt = LazyKodein(){
    Kodein.lazy {
        bind<Logger>() with singleton { AndroidLogger() }
        import(configModule)
    }
}

object KodeinConfig {

    @Volatile
    private var canConfigureBase = true

    lateinit var configModule : Kodein.Module

    fun addConfig(config: Kodein.Builder.() -> Unit) {
        if (canConfigureBase) {
            configModule = Kodein.Module("config",init = config)
            canConfigureBase = false
        }
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Kotlin 支持的框架有:Ktor、Spring、Anko、Kodein、Kotlinx.html、Spek、Kotlin Android Extensions、Kotlin Serialization、Kotlin Coroutines 和 TornadoFX。 ### 回答2: Kotlin是一种基于Java虚拟机的编程语言,因此可以利用Java生态圈中的众多框架。此外,Kotlin也有一些独有的框架,下面是一些常见的Kotlin框架: 1. Ktor: Ktor是一个轻量级的Web框架,用于构建异步和非阻塞的Web应用程序。它提供了一个简单易用的API,支持各种服务器和客户端功能。 2. Anko: Anko是Kotlin的一个功能强大且易于使用的库,用于简化Android应用程序的开发。它提供了一系列的DSL(领域特定语言)来简化UI创建,数据库操作,异步任务等常见任务。 3. Exposed: Exposed是一个轻量级的ORM(对象关系映射)库,用于简化数据库的访问和操作。它提供了简洁的API,易于理解和使用,支持各种数据库。 4. Koin: Koin是一个轻量级的依赖注入框架,用于管理应用程序中的对象和它们之间的依赖关系。它通过提供简单直观的API,使得依赖注入变得容易。 5. TornadoFX: TornadoFX是一个用于构建JavaFX应用程序的Kotlin框架。它提供了强大且易于使用的API,通过DSL的方式简化了UI创建和事件处理。 这只是Kotlin的一些框架示例,实际上还有很多其他的框架可供选择,涵盖了各种应用程序开发的需求。Kotlin作为一种灵活且功能强大的语言,为开发人员提供了丰富的选择。 ### 回答3: Kotlin是一种基于Java虚拟机的编程语言,因其简洁、安全和互操作性等特点,逐渐在开发者中得到广泛使用。Kotlin具备强大的框架生态系统,以下是其中一些流行的框架: 1. Ktor:Ktor是一个轻量级的Web框架,用于构建可扩展且异步的后端应用程序。它提供简洁的API,易于使用和学习,并支持异步协程。 2. Spring Boot with Kotlin:Kotlin集成了Spring Framework,使得使用Kotlin编写Spring Boot应用程序变得更加简洁和易用。Spring Boot提供了丰富的功能和工具来快速构建和部署应用程序。 3. Exposed:Exposed是一个轻量级的SQL库,用于与数据库交互。它使用Kotlin的强类型和DSL(领域特定语言)的特性,提供了简单、类型安全且易于维护的数据库访问方式。 4. Anko:Anko是一个用于Android开发的Kotlin库,它提供了简化和加快Android应用程序开发的工具和实用功能,例如DSL布局构建、数据库操作和异步任务处理。 5. Arrow:Arrow是一个函数式编程库,旨在帮助开发者以函数式和声明式的方式构建应用程序。它提供了一组操作符和类型类, 帮助开发者编写简洁、可维护和高效的代码。 除了上述框架外,Kotlin还支持许多其他的框架,例如Koin(轻量级的依赖注入框架)、JUnit(单元测试框架)和Mockito(模拟框架)等。这些框架使得Kotlin在不同领域和平台上开发应用程序时更加便捷和高效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值