Je suis encore au début de l'apprentissage de la scala en plus de Java et je ne l'ai pas compris. Comment peut-on faire de l'ID? puis-je ou dois-je utiliser une bibliothèque DI existante, doit-elle être effectuée manuellement ou existe-t-il un autre moyen?
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.
Dick Wall's SubCut est une nouvelle bibliothèque d'injection de dépendance spécialement conçue pour Scala.
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 mix-ins), SubCut est basé sur l'initialisation à l'exécution de modules immuables et l'injection dynamique en interrogeant les modules liés par type, noms de chaîne ou noms de scala.Symbol.
Vous pouvez en savoir plus sur la comparaison avec le modèle Cake dans le document GettingStarted .
L'injection de dépendance elle-même peut être effectuée sans aucun outil, cadre ou support de conteneur. Il vous suffit de supprimer new
s de votre code et de les déplacer vers des constructeurs. La partie fastidieuse qui reste reste le câblage des objets au "bout du monde", où les conteneurs aident beaucoup.
Cependant, avec les macros 2.10 de Scala, vous pouvez générer le code de câblage lors de la compilation et bénéficier d’un câblage automatique et d’une sécurité de type.
Un projet récent illustre une DI basée uniquement sur une injection de constructeur: zalando/grafter
Quel est le problème avec l'injection de constructeur à nouveau?
Il y a beaucoupbibliothèques ou approches pour faire injection de dépendance en Scala. Grafter revient aux principes de base de l'injection de dépendance par en utilisant simplement l'injection du constructeur: pas de réflexion, pas de xml, pas d'annotations, pas d'héritage ou d'auto-types.
Ensuite, Grafter n’ajoute au constructeur que le support nécessaire pour:
- instancier une application à base de composants à partir d'une configuration
- ajuster le câblage (créer des singletons)
- tester l'application en remplaçant des composants
- démarrer/arrêter l'application
Grafter cible toutes les applications possibles car il se concentre sur l’association de seulement 3 idées:
- classes de cas et interfaces pour les composants
- Instances de Reader et informes pour la configuration
- réécriture des arbres et kiama pour tout le reste!
Je ne l'ai pas déjà 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.
Les posts précédents couvraient les techniques. Je voulais ajouter un lien à l'exposé de Martin Odersky du mois de mai 2014 sur les objectifs du langage Scala. Il identifie les langues qui "nécessitent" un conteneur DI pour injecter des dépendances comme mal implémentées. Je suis personnellement d’accord avec cela, mais ce n’est qu’une opinion. Cela semble indiquer que l'inclusion d'une dépendance DI dans votre projet Scala n'est pas idiomatique, mais là encore, il s'agit d'une opinion. En pratique, même avec un langage conçu pour injecter des dépendances de manière native, l’utilisation d’un conteneur permet d’obtenir une certaine cohérence. Cela vaut la peine d’examiner les deux points de vue à vos fins.
En plus de la réponse de Dan Story, j'ai blogué à propos d'une variante de DI qui utilise également des constructions de langage mais n'est pas mentionnée dans le message de Jonas: Injection de valeur sur les traits .
J'ai montré comment j'ai créé un conteneur de DI fonctionnel très simple dans Scala en utilisant 2.10 ici.