web-dev-qa-db-fra.com

Comment utiliser Koin dans plusieurs modules?

Il y a deux modules dans mon Android, module d'application et module lib.

Ces deux modules ont besoin de Koin pour D.I., donc j'appelle startKoin dans MyApplication class dans le module app, et IninKointContentProvider dans le module lib comme ci-dessous.

// app module
class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        startKoin(this, modules1)
    }
}

// lib module
class InitKoinContentProvider : ContentProvider() {
    override fun onCreate(): Boolean {
        startKoin(context.applicationContext, modules2)
        return true
    }
}

Ensuite, l'application s'est bloquée et a affiché ce message

Caused by: org.koin.error.BeanOverrideException: Try to override definition with Single [class='Android.content.Context'], but override is not allowed. Use 'override' option in your definition or module.

Je suppose que startKoin ne peut être appelé qu'une seule fois.

La solution que j'ai trouvée consiste à fusionner deux modules koin puis à appeler startKoin dans MyApplication, mais je n'aime pas ça. Le module Lib peut être importé par un autre projet Android qui n'utilise pas de koin, dans ce cas, je pense qu'il est préférable d'appeler startKoin dans InitKoinContentProvider.

Une solution à ce problème ?? Merci!

6
aiueoH

TL; DR Utilisez les méthodes single/factory Avec override param défini sur true lorsque vous fournissez vos dépendances qui remplacent celles fournies par les modules chargés auparavant.

single<Manager>(override = true) { TestManager() }

J'ai rencontré un problème similaire lorsque j'ai essayé de remplacer l'une des dépendances à des fins de test d'interface utilisateur. Lorsque je configure dans Application.onCreate():

startKoin {
   module {
       single { Printer() }
   }
}

puis dans before méthode de test:

loadKoinModules(module {
    single<Printer> { TestPrinter() }
})

Je reçois une exception d'exécution pendant le test: org.koin.core.error.DefinitionOverrideException: Already existing definition or try to override an existing one

Et la solution est de montrer à Koin que vous intentionnellement remplacez cette dépendance en utilisant override param de la fonction single comme ça:

loadKoinModules(module {
    single<Printer>(override = true) { TestPrinter() }
})
0
Andrii Panasiuk