web-dev-qa-db-fra.com

Découvrez comment injecter en dehors de Android activité / compatibilité avec l'application

Koin est une nouvelle bibliothèque légère pour DI et peut être utilisée dans Android as ainsi que dans les applications kotlin autonomes.

Habituellement, vous injectez des dépendances comme celle-ci:

class SplashScreenActivity : Activity() {

    val sampleClass : SampleClass by inject()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }
}

avec la méthode inject().

Mais qu'en est-il de l'injection de choses dans des endroits où le contexte d'activité n'est pas disponible, c'est-à-dire en dehors d'une activité ?

Il y a le KoinComponent qui vient à la rescousse. Dans n'importe quelle classe, vous pouvez simplement:

class SampleClass : KoinComponent {

    val a : A? by inject()
    val b : B? by inject()
}

L'extension de KoinComponent vous donne accès à la méthode inject().

N'oubliez pas qu'il suffit généralement d'injecter des trucs de la manière habituelle:

class SampleClass(val a : A?, val b: B?)

Koin fournit une solution pour cela en utilisant l'interface KoinComponent. Par exemple, si vous avez besoin d'obtenir des dépendances dans votre référentiel, vous pouvez simplement implémenter l'interface KoinComponent. Il vous donne accès à diverses fonctionnalités de Koin telles que get() et inject(). Utilisez KoinComponent uniquement lorsque vous ne pouvez pas réécrire le constructeur pour accepter les dépendances en tant que paramètres de constructeur.

class MyRepository: Repository(), KoinComponent {
  private val myService by inject<MyService>()
}

L'injection de constructeur est meilleure que cette approche.

Par exemple, la même chose peut être réalisée en:

class MyRepository(private val service: MyService): Repository() {
    ...
}

Et vous pouvez ajouter la définition pour instancier cette classe dans un module koin:

val serviceModule = module {
    ...

    factory { MyService() }
}
val repositoryModule = module {
    ...

    factory { MyRepository(get<MyService>()) }
}
11
harold_admin

Si vous ne voulez pas implémenter d'interfaces, regardez simplement comment KoinComponent.inject() est implémenté et faites quelque chose de similaire vous-même:

val sampleClass by lazy { GlobalContext.get().koin.get<SampleClass>() }
0
Mark