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