1

我需要为一个新项目学习 Dagger 2,并且正在努力理解这一切。

我看过一些教程,它们给出了一些清晰的说明,但我仍然有很多困惑,例如各种移动部件(组件、模块、注入器、提供程序)如何相互关联。

我在想,也许有人可以向我展示使用 Kodein 进行依赖注入的以下代码的 Dagger 等效实现,这将有助于弥合我在理解上的差距:

注入.kt

fun depInject(app: Application): Kodein {
    return lazy {
        bind<Application>() with instance(app)
        bind<Context>() with instance(app.applicationContext)
        bind<AnotherClass>() with instance(AnotherClass())   
    }
}

基础应用程序.kt

class BaseApplication: Application() {

    companion object {
        lateinit var kodein: Kodein
            private set
    }

    override fun onCreate() {
        super.onCreate()
        kodein = depInject(this)
    }
}

然后在我需要注入的任何地方我只使用:

 private val context: Context by BaseApplication.kodein.instance()

谢谢!

4

1 回答 1

1
fun depInject(app: Application): AppComponent {
    return lazy {
        DaggerAppComponent.factory().create(app)
    }
}

@Singleton
@Component(modules = [AppModule::class])
interface AppComponent {
    fun context(): Context

    @Component.Factory
    interface Factory {
        fun create(@BindsInstance app: Application): AppComponent
    }
}

@Module
object AppModule {
    @Provides 
    @JvmStatic
    fun context(app: Application): Context = app.applicationContext
}

然后

class BaseApplication: Application() {

    companion object {
        lateinit var component: AppComponent
            private set
    }

    override fun onCreate() {
        super.onCreate()
        component = depInject(this)
    }
}

private val context: Context by lazy { BaseApplication.component.context() }

编辑:

@Singleton class AnotherClass @Inject constructor() {
}

@Singleton
@Component(/*...*/)
interface AppComponent {
    ...

    fun anotherClass(): AnotherClass

    ...
}
于 2019-07-25T14:35:11.177 回答