JavaScript Injection De Dépendance
Je suis nouveau à JavaScript. Je me demande comment l'injection de dépendance est en train d'être implémenté en JavaScript? J'ai cherché sur internet mais impossible de trouver quoi que ce soit.
- Comme vous pouvez le voir à partir de Yusufaytas réponse, la mécanique de la façon de l'auto-fil dépendances diffère complètement de le faire dans .NET. Avec .NET, vous avez à réfléchir sur le type de système et de nous injecter types en fonction du type du paramètre. Avec Javascript, vous avez à "réfléchir" sur les noms des arguments, car il n'y a pas (découvrable) types en javascript.
Vous devez vous connecter pour publier un commentaire.
La première chose que nous avons besoin d'une configuration de fournir des dépendances avec des qualificatifs. Pour ce faire, nous définissons une dépendance à définir des dépendances dans l'Injecteur de classe. Nous utilisons dépendance à définir comme notre conteneur, qui prendra soin de nos instances de l'objet mappé à qualificatifs. Pour ajouter une nouvelle instance avec un qualificatif à la dépendance ensemble, nous définissons une méthode add. Par la suite, nous définissons la méthode get pour récupérer notre exemple. Dans cette méthode, nous trouvons d'abord le tableau d'arguments et puis la carte de ces arguments pour les dépendances. Après cela, nous avons juste à construire l'objet avec nos dépendances et de le retourner. Pour plus d'informations et des exemples, veuillez consulter le post sur mon blog.
Vous pouvez utiliser AngularJS comme un exemple. Si c'est une bonne chose, vous aurez à décider pour vous-même. J'ai écrit il y a une semaine une
article sur demistifying l'injection de dépendance dans AngularJS. Ici, vous pouvez lire le code de l'article:
Pour moi yusufaytas réponse était exactement ce dont j'avais besoin! La seule fonctionnalités manquantes ont été:
Je voulais avoir la capacité de faire quelque chose comme ceci:
Je me suis donc retrouvé avec le code suivant:
Mise à jour - 21.5.2018
J'ai été en utilisant cette solution depuis quelques années maintenant. Comme je l'ai déplacé mon code de base de la Machine a ecrire la solution évolué avec elle pour soutenir à la fois la Machine et le JavaScript. Après un certain temps que le code a été exécuté en production j'ai récemment (il y a deux jours) a publié une bibliothèque basée sur cette solution. N'hésitez pas à consulter sortir, questions ouvertes, etc.
menthe poivrée-di
Nous allons apprendre à faire un super simple l'exemple du monde réel 🙂
L'exemple de la classe, je vais vous parler ici est un
Printer
qui a besoin d'un
driver
d'imprimer quelque chose. Je l'ai démontréles avantages de l'injection de dépendance modèle de conception en 4
les étapes pour arriver à la meilleure solution à la fin.
Décision1: pas de l'injection de dépendances utilisés:
l'utilisation est simple, il est facile de faire une nouvelle imprimante de cette façon mais cette imprimante n'est pas flexible.
Case2: résumé les fonctionnalités à l'intérieur de la
print
méthode dans une nouvelle classe appeléeDriver
:Donc notre classe d'Imprimante est maintenant plus modulaire, propre et facile de undrestand mais Il n'est pas souple, mais encore. Chaque fois que vous utilisez
new
mot-clé vous sont effectivement de codage en dur quelque chose; dans ce cas, vous êtes la construction de un conducteur à l'intérieur de votre Imprimante dans le monde réel est un exemple d'une imprimante qui est livré avec un pilote qui ne peuvent jamais changer!Case3: Injecter déjà fait le pilote de votre imprimante
Une meilleure version est d'injecter un pilote au moment où nous construisons une imprimante
ce qui signifie que vous pouvez faire n'importe quel type d'imprimante, couleur ou noir&blanc, parce que c'
fois que le pilote est en train d'être fait dans l'isolement et à l'extérieur de la classe d'Imprimante, puis
compte tenu de (INJECTÉE!) dans le
Printer
...utilisation est maintenant différente, comme un utilisateur, afin de disposer d'une imprimante, vous devez d'abord
construire (faire) un pilote (de votre choix!) et puis passer à ce pilote de votre Imprimante. Il peut sembler que l'utilisateur final doit maintenant d'en savoir un peu plus sur le système, cependant, cette structure donne plus de felexibility. Les utilisateurs peuvent passer d'un pilote, aussi longtemps que valable! par exemple, disons que nous avons un BWDriver (noir & blanc) type de pilote; l'utilisateur peut créer un nouveau pilote de ce type et l'utiliser pour faire une nouvelle Imprimante qui imprime en noir et blanc.
So far So good! Mais ce que vous pensez que nous pouvons faire mieux et ce que vous en pensez a encore un peu de place à l'adresse ici?! Je suis sûr que vous pouvez le voir aussi!
La création d'une nouvelle imprimante chaque fois nous avons besoin de notre imprimante pour imprimer avec
un autre pilote! C'est parce que nous passons notre moteur de choix pour
la classe d'Imprimante au moment de la construction; si l'utilisateur veut utiliser un autre pilote dont ils ont besoin pour créer une nouvelle Imprimante avec le pilote; par exemple, si maintenant je veux faire une impression couleur que je dois faire:
Case4: Fournir un setter pour définir le pilote de votre imprimante à TOUT MOMENT!
L'Injection de dépendance n'est pas vraiment un concept difficile à comprendre. Le terme peut être un peu surchargé, mais une fois que vous avez réalisé son but, vous trouverez vous-même en utilisant la plupart du temps.
code markup
pour le texte normal, cela diminue la lisibilité.Je dirais DI est un out-of-the-box fonctionnalité de JS/ES2015. 🙂 Bien sûr, il n'est pas complet CIO conteneurs, mais paraît utile, n'est-ce pas? Découvrez un exemple ci-dessous!
JS:
Vous pouvez envelopper les dépendances dans
_.once
(voir trait de soulignement ou lodash) pour les transformer en des singletons.JS:
HTML:
Prendre un butin à la Moucheture: https://gist.github.com/elfet/11349215
J'ai codé mon propre JavaScript Injection de Dépendance Cadre appelé Di-Ninja
https://github.com/di-ninja/di-ninja
Il est très complet et est actuellement le seul en javascript, que je sache, qui mettent en œuvre la Composition de la Racine modèle de conception,
pour vous aider à garder toutes les choses découplé et câbler les composants de l'application et de configuration à une racine unique endroit.
http://blog.ploeh.dk/2011/07/28/CompositionRoot/
Cela fonctionne bien avec NodeJS et Webpack
Tout commentaire serait apprécié
candiJS est un léger implicite de l'injection de dépendance et la création d'un objet de la bibliothèque. Avoir un coup d'oeil
Exemple:
Injection est un poids léger mais puissant DI conteneur, il peut bien gérer la promesse d'injection.
L'Injection De La Page D'Accueil
Le Code Source à seulement 100+ lignes.
Des Cas De Test de voir ses exemples.
bulle-di est un léger DI conteneur pour le Javascript et le Tapuscrit.
Il vous permet de vous inscrire à l'usine méthodes (rappels) ou d'instances. Ci-dessous est un exemple simple (d'autres exemples).
npm install --save bubble-di
Pour être complètement honnête, après avoir travaillé avec JavaScript (principalement sur le côté serveur) et l'ensemble de l'écosystème pendant quelques années, j'ai le sentiment que l'injection de dépendance (pour ne pas mentionner les conteneurs) n'a pas vraiment fait régulièrement JS du programmeur boîte à outils. C'est probablement la raison pour laquelle il n'y a pas beaucoup d'informations à ce sujet là (il est de mieux en mieux tout de même).
Par opposition à un langage comme Java, vous ne pouvez pas compter sur les types statiques en JavaScript. Ce seul fait les règles de la méthode traditionnelle de déclarer les dépendances via des interfaces. Vous pouvez bien sûr ajouter des types de JS (voir Flux), mais ceux-ci sont gommés avant que le code est exécuté. La même chose s'applique pour la Machine a ecrire, mais je crois qu'il y a un moyen de préserver les types comme non exécutée de métadonnées. En outre, le JavaScript ne prend pas en charge les annotations (même si il y a un proposition pour elle).
Les gens ont été se faire dans les limites de diverses manières. Certains conteneurs analyser la fonction/définition de la classe (comme ils l'appellent
.toString()
sur le passé de fonction, de classe et d'analyser la chaîne résultante) et de regarder les dépendances en fonction des noms, certains exigent des fonctions/classes pour fournir une propriété/méthode statique pour obtenir la liste des dépendances.Je travaille moi-même sur un conteneur appelé Ashley, qui demande simplement à les dépendances dans le cadre du processus de liaison. Aucune nouvelle inspection requise.
Plus d'exemples sur GitHub.
Même si c'est une vieille question que j'ai envie. 😉