Comment ferait-on l’dependency injection dans Scala?

Je suis encore au début de l’apprentissage du scala en plus du java et je ne l’ai pas compris comment est-ce qu’on est censé y faire de la DI? puis-je ou devrais-je utiliser une bibliothèque DI existante, devrait-il être fait manuellement ou existe-t-il une autre façon?

Les frameworks Java DI standard fonctionnent généralement avec Scala, mais vous pouvez également utiliser des constructions de langage pour obtenir le même effet sans dépendances externes.

Une nouvelle bibliothèque d’dependency injection spécifiquement pour Scala est la SubCut de Dick Wall.

Alors que l’article de Jonas Bonér référencé dans la réponse de Dan Story met l’accent sur les instances liées à la compilation et l’injection statique (via les mix-ins), SubCut repose sur l’initialisation des modules immuables et l’injection dynamic en interrogeant les modules liés ou noms scala.Symbol.

Vous pouvez en savoir plus sur la comparaison avec le modèle Cake dans le document GettingStarted .

Dépendances L’injection proprement dite peut être effectuée sans aucun outil, framework ou support de conteneur. Il vous suffit de supprimer les new de votre code et de les déplacer vers les constructeurs. La seule partie fastidieuse qui rest consiste à câbler les objects à «la fin du monde», où les conteneurs aident beaucoup.

Bien qu’avec les macros 2.10 de Scala, vous pouvez générer le code de câblage à la compilation et disposer d’un câblage automatique et d’une sécurité de type.

Voir le guide d’dependency injection dans Scala

Un projet récent illustre une DI basée uniquement sur l’injection de constructeur: zalando / grafter

Quel est le problème avec l’injection constructeur à nouveau?

Il existe de nombreuses bibliothèques ou approches pour l’ dependency injection dans Scala. Grafter revient aux fondamentaux de l’dependency injection en utilisant simplement l’injection de constructeur : pas de reflection, pas de xml, pas d’annotations, pas d’inheritance ou de self-types.

Ensuite, Grafter ajoute à l’injection du constructeur le support nécessaire pour:

  • instancier une application basée sur des composants à partir d’une configuration
  • affiner le câblage (créer des singletons)
  • tester l’application en remplaçant les composants
  • démarrer / arrêter l’application

Grafter cible toutes les applications possibles car il se concentre sur l’association de 3 idées:

  • classes de cas et interfaces pour les composants
  • Instances de lecteur et sans forme pour la configuration
  • réécriture d’arbres et kiama pour tout le rest!

Je ne l’ai pas fait moi-même, mais la plupart des frameworks DI fonctionnent au niveau du bytecode (AFAIK), il devrait donc être possible de les utiliser avec n’importe quel langage JVM.

En plus de la réponse de Dan Story, j’ai blogué à propos d’une variante DI qui utilise également des constructions de langage mais n’est pas mentionnée dans le post de Jonas: Value Injection on Traits . Ce modèle fonctionne très bien pour moi.

J’ai montré comment j’ai créé un conteneur DI fonctionnel très simple en Scala en utilisant ici 2.10 .

Les messages précédents couvraient les techniques. Je voulais append un lien à la conférence de mai 2014 de Martin Odersky sur les objectives linguistiques de Scala. Il identifie les langages qui “nécessitent” un conteneur DI pour injecter des dépendances peu implémentées. Je suis d’accord avec cela personnellement, mais ce n’est qu’une opinion. Cela semble indiquer que l’inclusion d’une dépendance à l’ID dans votre projet Scala n’est pas idiomatique, mais là encore, c’est l’opinion. En pratique, même avec un langage conçu pour injecter des dépendances en mode natif, l’utilisation d’un conteneur permet d’obtenir une certaine cohérence. Cela vaut la peine de considérer les deux points de vue pour vos besoins.

https://youtu.be/ecekSCX3B4Q?t=1154