Ai-je besoin d'injection de dépendance dans NodeJS, ou la façon de traiter avec ...?
J'ai actuellement de la création de certains projets expérimentaux avec nodejs. J'ai programmé un lot de Java EE des applications web avec le Printemps et apprécié la facilité de l'injection de dépendance là.
Maintenant, je suis curieux de savoir: Comment dois-je faire de l'injection de dépendances avec noeud? Ou: ai-je besoin? Est-il un remplaçant concept, parce que le style de programmation est différente?
Je suis en train de parler de choses simples, comme le partage d'une connexion de base de données objet, jusqu'à présent, mais je n'ai pas trouvé une solution qui me satisfait.
- Si vous décidez d'utiliser DI, OpenTable récemment open-source une bibliothèque pour ça: github.com/opentable/spur-ioc je l'ai utilisé (j'y travaille), et on peut dire que c'est assez simple et très utile pour tester.
Vous devez vous connecter pour publier un commentaire.
En bref, vous n'avez pas besoin d'un conteneur d'injection de dépendance ou d'un service de localisation comme vous le feriez en C#/Java. Depuis Node.js, exploite la
module pattern
, il n'est pas nécessaire d'effectuer constructeur ou des biens de l'injection. Bien que vous le pouvez encore.La grande chose à propos de JS, c'est que vous pouvez modifier à peu près tout pour obtenir ce que vous voulez. C'est pratique quand il s'agit de tester.
Voici mon très boiteux exemple artificiel.
MyClass.js
:MyClass.test.js
:Avis comment
MyClass
dépend de lafs
module? Comme @ShatyemShekhar mentionné, vous pouvez le faire en effet, le constructeur ou bien à l'injection dans d'autres langues. Mais il n'est pas nécessaire en Javascript.Dans ce cas, vous pouvez faire deux choses.
Vous pouvez talon la
fs.readdirSync
méthode ou vous pouvez revenir un tout autre module lorsque vous appelezrequire
.Méthode 1:
Méthode 2:
La clé est de tirer parti de la puissance de Node.js et Javascript. Remarque, je suis un CoffeeScript gars, mon JS syntaxe est peut-être incorrect quelque part. Aussi, je ne dis pas que c'est la meilleure façon, mais c'est une façon. Javascript gourous pourriez être en mesure de carillon avec d'autres solutions.
Mise à jour:
Cela devrait répondre à votre question spécifique concernant les connexions de base de données. J'aimerais créer un module séparé pour votre pour encapsuler votre connexion de base de données logique. Quelque chose comme ceci:
MyDbConnection.js
: (assurez-vous de choisir un meilleur nom)Puis, un module qui a besoin d'une connexion de base de données seraient alors il suffit d'inclure votre
MyDbConnection
module.SuperCoolWebApp.js
:Ne suivez pas cet exemple verbatim. C'est un piètre exemple pour essayer de communiquer que vous tirer parti de l'
module
modèle pour la gestion de vos dépendances. Espérons que cela aide un peu plus.testing
db lorsque NODE_ENV est fixé àtest
outesting
. Cela fait-il sens? Dans la plupart des cas, vous devriez certainement pas polluer l'espace de noms global. Que vous avez à jeter ce que vous savez sur les modèles de conception avec C++/C#/Java et d'embrasser la simplicité de JS.require('my_logger_library')
, les gens à l'aide de mon composant à remplacer le besoin d'utiliser leur propre bibliothèque. Au lieu de cela, j'ai peut permettre aux gens de passer un rappel qui encapsule un enregistreur de mise en œuvre dans les composants "constructeur" ou "init" la méthode. C'est le but de DI.method 2
de sorte qu'il fonctionne dans tous les cas. Ce sont de revendication est invalide?require
est utile lorsque vous avez connaissance d'un module, mais DI est utile lorsque vous vous attendez à un module compatible avec une interface qui vous seront remis lors de l'exécution, mais ne savent pas à ce sujet lors de l'écriture de votre code. Par exemple, supposons que vous avez installé un module qui nécessite uneDbConnection
. Il ne devrait pasrequire
un chemin inconnu, d'ailleurs remplacement d'une plate-forme de base de la fonctionnalité n'est pas une bonne idée. Comme une application augmente, il exige de plus en plus la dépendance de câblage.require
est la façon de gérer les dépendances en Node.js et certainement c'est intuitive et efficace, mais il a aussi ses limites.Mon conseil est de prendre un coup d'oeil à certains de l'Injection de Dépendance des conteneurs disponibles aujourd'hui pour Node.js pour avoir une idée sur ce que sont leurs avantages/inconvénients. Certains d'entre eux sont:
Pour n'en nommer que quelques-uns.
Maintenant la vraie question est, que pouvez-vous atteindre avec un Node.js DI conteneur, par rapport à un simple
require
?Pour:
Contre:
require
certainement se sent comme vous êtes la déviation du Nœud façon de penser.Comme avec n'importe quoi liés au développement de logiciels, le choix entre les DI ou
require
dépend de vos besoins, de votre de la complexité du système, et votre style de programmation.Je sais que ce fil est assez vieux à ce point, mais j'ai pensé carillon avec mes pensées sur ce. Le TL;DR est qu'en raison de la non typé, de la nature dynamique de JavaScript, vous pouvez effectivement faire beaucoup de chose sans avoir recours à l'injection de dépendance (DI) au motif ou à l'aide d'un DI-cadre. Cependant, comme une application devient plus grand et plus complexe, DI peut certainement aider à la maintenabilité du code.
DI en C#
De comprendre pourquoi DI n'est pas que les grandes d'un besoin en JavaScript, il est utile de regarder un langage fortement typé comme le C#. (Mes excuses à ceux qui ne connaissent pas le C#, mais il devrait être assez facile à suivre.) Disons que nous avons une application qui décrit une voiture et son klaxon. Vous serait de définir deux classes:
Il y a quelques problèmes d'écrire le code de cette façon.
Car
classe est étroitement associée à la mise en œuvre de la corne dans laHorn
classe. Si nous voulons changer le type de pavillon utilisé par la voiture, nous devons modifier laCar
classe même si son utilisation de la corne ne change pas. Cela fait de test difficile car on ne peut pas tester leCar
classe dans l'isolement de sa dépendance, laHorn
classe.Car
classe est responsable du cycle de vie de laHorn
classe. Dans un exemple simple comme cela, il n'est pas un gros problème, mais dans les applications réelles dépendances dépendances, qui ont des dépendances, etc. LeCar
classe devrait être responsable de la création de l'ensemble de l'arborescence de ses dépendances. Ce n'est pas seulement compliqué et répétitif, mais il viole la "responsabilité unique" de la classe. Il devrait se concentrer sur la voiture, pas la création d'instances.Maintenant, laissez-nous refactoriser cette utilisation d'une injection de dépendance modèle.
Nous avons fait deux choses importantes ici. Tout d'abord, nous avons mis en place une interface de notre
Horn
classe implémente. Cela nous permet de code de laCar
classe de l'interface au lieu de la mise en oeuvre particulière. Maintenant, le code pourrait prendre ce qui implémenteIHorn
. Deuxièmement, nous avons pris la corne de l'instanciation deCar
et de le transmettre à la place. Cela résout les problèmes ci-dessus et laisse à la fonction principale de l'application pour gérer des instances et de leurs cycles de vie.Ce que cela signifie, c'est que pourrait introduire un nouveau type de klaxon de la voiture à utiliser, sans toucher à la
Car
classe:Le principal pourrait juste injecter une instance de la
FrenchHorn
classe à la place. Également, cela simplifie considérablement les tests. Vous pouvez créer unMockHorn
classe d'injecter dans laCar
constructeur pour s'assurer que vous testez juste leCar
classe dans l'isolement.L'exemple ci-dessus montre le manuel de l'injection de dépendance. Généralement, DI est fait avec un cadre (par exemple, L'unité ou Ninject dans le C# du monde). Ces cadres ne tous les de la dépendance de câblage pour vous par la marche de votre graphe de dépendance et la création d'instances que nécessaire.
La Norme Node.js Façon
Examinons maintenant le même exemple dans Node.js. Nous serions probablement briser notre code en 3 modules:
Parce que JavaScript est non typé, nous n'avons pas tout à fait le même couplage étroit que nous avions avant. Il n'est pas nécessaire pour les interfaces (et qui n'existe pas) comme les
car
module va juste tenter d'appeler lehonk
méthode sur ce que l'horn
module exportations.En outre, en raison du Nœud
require
caches tout, les modules sont essentiellement des singletons stockées dans un conteneur. Tout autre module qui effectue unrequire
sur lehorn
module obtiendrez exactement la même instance. Cela rend le partage de singleton objets comme des connexions de base de données très facile.Maintenant, il est toujours la question que l'
car
module est responsable de l'extraction de sa propre dépendancehorn
. Si vous voulais la voiture à utiliser un autre module pour sa corne, vous auriez à changer lerequire
instruction dans lecar
module. Ce n'est pas une chose commune à faire, mais il cause des problèmes avec les tests.La manière habituelle les gens à gérer les tests de problème avec proxyquire. En raison de la nature dynamique de JavaScript, proxyquire intercepte les appels à exiger et retours tous les stubs/se moque de vous fournir à la place.
C'est plus que suffisant pour la plupart des applications. Si cela fonctionne pour votre application, puis aller avec elle. Cependant, dans mon expérience, que les applications deviennent plus gros et plus complexes, le maintien de code comme cela devient plus difficile.
DI en JavaScript
Node.js est très flexible. Si vous n'êtes pas satisfait avec la méthode ci-dessus, vous pouvez écrire vos modules à l'aide de l'injection de dépendance modèle. Dans ce modèle, chaque module exporte une fonction de fabrication (ou d'un constructeur de la classe).
Ce qui est très analogue à la méthode C# plus tôt dans la
index.js
module est responsable par exemple de cycle de vie et de câblage. Le test unitaire est très simple, comme vous pouvez juste passer dans les mocks/stubs pour les fonctions. Encore une fois, si c'est assez bon pour votre demande d'aller avec elle.Bolus DI Cadre
À la différence de C#, il n'existe pas de standard établi DI cadres pour vous aider dans votre gestion de la dépendance. Il y a un certain nombre de cadres dans le mécanisme national de prévention de registre, mais aucun n'a une adoption généralisée. Beaucoup de ces options ont été cités déjà dans les autres réponses.
Je n'étais pas particulièrement heureux avec toutes les options disponibles, j'ai donc écrit mon propre appelé bolus. Bolus est conçu pour fonctionner avec le code écrit dans la DI de style ci-dessus et essaie d'être très SEC et très simple. En utilisant exactement les mêmes
car.js
ethorn.js
modules ci-dessus, vous pouvez réécrire laindex.js
module avec bolus comme:L'idée de base est que vous créez un injecteur. Vous vous inscrivez tous vos modules dans l'injecteur. Ensuite il vous suffit de résoudre ce dont vous avez besoin. Bolus vont marcher sur le graphe de dépendance et de créer et d'injecter les dépendances nécessaires. Vous n'enregistrez pas beaucoup dans un jouet exemple comme ça, mais dans les grandes applications complexes sur des arbres de dépendance de l'économie est énorme.
Bolus prend en charge un tas de fonctionnalités intéressantes comme des dépendances optionnelles et de tester des variables globales, mais il y a deux avantages principaux que j'ai vu par rapport à la norme Node.js approche. Tout d'abord, si vous avez beaucoup d'applications similaires, vous pouvez créer un privé mnp module pour votre base qui crée un injecteur et les registres des objets utiles sur elle. Alors vos apps pouvez ajouter, remplacer, et de résoudre, au besoin, comme la façon dont AngularJS est injecteur fonctionne. Deuxièmement, vous pouvez utiliser bolus de gérer les diverses situations de dépendances. Par exemple, vous pourriez utiliser un middleware pour créer un enfant de l'injecteur par demande, enregistrer l'id utilisateur, id de session, enregistreur, etc. sur l'injecteur ainsi que tous les modules en fonction de ceux-ci. Ensuite résoudre ce dont vous avez besoin pour traiter les requêtes. Cela vous donne les instances de vos modules par demande et évite d'avoir à passer l'enregistreur, etc. le long de chaque module à l'appel de la fonction.
proxyquire
commesinon
qui vous permet de le faire très concis se moque, par exemplelet readFileStub = sinon.stub(fs, 'readFile').yields(new Error('something went wrong'));
et les appels suivants àfs.readFile
sera de retour d'erreur jusqu'à ce que vous revenir le stub viareadFileStub.restore()
. Personnellement, je trouve DI d'utilisation douteuse, car je crois que c'est presque nécessite l'utilisation de classes/objets, ce qui est une hypothèse douteuse compte tenu de javascript fonctionnelle de l'orientation.jest
,rewire
,proxyquire
, etc.? Merci.J'ai aussi écrit un module pour ce faire, il est appelé rewire. Utilisez simplement
npm install rewire
et puis:J'ai été inspiré par Nathan MacInnes est injectr mais utilisé une approche différente. Je n'utilise pas
vm
à eval le test du module, en fait j'utilise du nœud propre besoin. De cette façon, votre module se comporte exactement comme l'utilisation derequire()
(à l'exception des modifications). Aussi, le débogage est entièrement pris en charge.J'ai construit L'électrolyte pour cet effet. L'autre injection de dépendance des solutions à l'extérieur, il y avait trop envahissante à mon goût, et de jouer avec le mondial
require
est un grief donné de la mine.Électrolyte embrasse modules, en particulier ceux que l'exportation d'un "setup" de la fonction comme vous le voyez dans Connect/Express middleware. Essentiellement, ces types de modules sont juste des usines pour certains, objet de leur retour.
Par exemple, un module qui crée une connexion de base de données:
Ce que vous voyez au fond sont annotations, un bit supplémentaire de métadonnées que l'Électrolyte utilise pour instancier et injecter des dépendances, automatiquement le câblage de votre application à l'ensemble des composants.
Pour créer une connexion de base de données:
Électrolyte transitivement traverse la
@require
'd dépendances, et l'injecte des instances comme arguments de la fonction exportée.La clé, c'est que ce mini-invasive. Ce module est totalement fonctionnelle, indépendante de l'Électrolyte lui-même. Cela signifie que vos tests unitaires pouvez tester juste le module de test, en passant dans la maquette des objets sans avoir besoin de dépendances supplémentaires à rewire internes.
Lors de l'exécution de la demande complète, l'Électrolyte étapes de l'inter-module de niveau, le câblage des choses ensemble, sans la nécessité pour les variables globales, les singletons ou excessive de la plomberie.
connect()
jette? Même si je ne suis pas familier avec l'API MySql pour le Nœud, je m'attends à ce que cet appel asynchrone, l'illustration n'est pas très clair.ioc.create
à partir d'une unité de test. Un test unitaire doit test seulement le module en cours de test, et de ne pas apporter dans les autres dépendances, y compris l'Électrolyte. En suivant ces conseils, vous neobjToTest = require('modulename')(mockObj1, mockObj2);
Je l'ai regardé en moi-même. Je n'aime pas l'introduction de la magie de la dépendance utils bibliothèques qui offrent des mécanismes de pirater mon module importations. Au lieu de cela, je suis venu avec un "guide" pour mon équipe plutôt d'indiquer explicitement les dépendances peuvent être raillé par l'introduction d'une usine de la fonction d'exportation au sein de mes modules.
Je faire un large usage de l'ES6 fonctionnalités pour les paramètres et de déstructuration, afin d'éviter certains passe-partout et de fournir un nommé dépendance remplacer mécanisme.
Voici un exemple:
Et voici un exemple de son utilisation
Excuse de l'ES6 syntaxe pour ceux peu familiers avec elle.
J'ai récemment vérifié ce fil de discussion pour la même raison que l'OP - la plupart des libs que j'ai rencontré temporairement la réécriture de la directive require. J'ai eu des degrés de succès avec cette méthode, et j'ai donc fini par utiliser l'approche suivante.
Dans le contexte d'une demande expresse - je wrap app.js dans un bootstrap.js fichier:
L'objet de la carte réussi à le chargeur ressemble à ceci:
Alors, plutôt que l'appel direct d'exiger...
Si aucun alias n'est situé dans le chargeur - alors, il va juste valeur par défaut à la régularité de l'exiger.
Ceci a deux avantages: je peux échanger dans n'importe quelle version de la classe, et il supprime la nécessité
pour utiliser un chemin relatif noms tout au long de l'application (donc Si j'ai besoin d'un custom lib ci-dessous
ou au-dessus de l'actuel fichier, je n'ai pas besoin de traverser, et nécessitent la mise en cache sera le module contre la même clé). Il me permet également de spécifier les objets fantaisie à n'importe quel point dans l'application, plutôt que dans l'immédiat suite de tests.
J'ai tout juste de publier un petit module npm pour plus de commodité:
https://npmjs.org/package/nodejs-simple-loader
La réalité est que vous pouvez tester votre node.js sans conteneur IoC parce que JavaScript est vraiment un langage de programmation dynamique et vous pouvez modifier presque tout au moment de l'exécution.
De considérer les éléments suivants:
De sorte que vous pouvez remplacer le couplage entre les composants au moment de l'exécution. J'aime à penser que nous devrions viser à dissocier nos modules JavaScript.
La seule façon de parvenir à un réel découplage est en supprimant la référence à la
UserRepository
:Cela signifie que quelque part d'autre, vous aurez besoin de faire l'objet composition:
J'aime l'idée de déléguer la composition d'objet à un conteneur IoC. Vous pouvez en apprendre plus sur cette idée dans l'article L'état actuel de l'inversion de la dépendance en JavaScript. L'article tente de démystifier certains "JavaScript conteneur IoC mythes":
Si vous aussi vous aimez l'idée d'utiliser un conteneur IoC, vous pouvez prendre un coup d'oeil à InversifyJS. La dernière version (2.0.0) prend en charge de nombreux cas d'utilisation:
Vous pouvez en apprendre plus à ce sujet à InversifyJS.
Pour ES6 j'ai développé ce conteneur
https://github.com/zazoomauro/node-dependency-injection
Ensuite, vous pouvez définir, par exemple, le choix de transport du conteneur:
Cette classe est maintenant beaucoup plus souple que vous avez séparé le choix de transport de la mise en œuvre et dans le récipient.
Maintenant que le service mailer est dans le conteneur que vous pouvez injecter en tant que dépendance d'autres classes. Si vous avez un NewsletterManager classe comme ceci:
Lors de la définition de la newsletter_manager a service, le service mailer n'existe pas encore. Utilisation de la classe de Référence à dire le récipient pour injecter le service mailer lorsqu'il initialise le gestionnaire de newsletter:
Vous pouvez également configurer le conteneur avec des fichiers de configuration comme Yaml, Json ou JS fichiers
Le conteneur de service peut être compilé pour plusieurs raisons. Ces raisons comprennent la vérification de tout les problèmes potentiels tels que les références circulaires et de faire le conteneur plus efficace.
J'ai toujours aimé la simplicité de la Coi concept - "Vous n'avez pas de savoir quelque chose au sujet de l'environnement, vous serez appelé par quelqu'un quand il le faut"
Mais tous les Cio implémentations j'ai vu a fait exactement le contraire - ils de l'encombrement du code avec encore plus de choses que sans elle. Donc, j'ai créé mon propre Cio qui fonctionne comme j'aimerais qu'il soit - il reste caché et invisible 90% du temps.
Il est utilisé dans MonoJS framework web http://monojs.org
C'est fait comme ça - enregistreuse une fois dans le fichier config.
Et l'utiliser n'importe où
Vous pouvez voir l'intégralité de la définition de composant de code (avec DB Connexion de Composants et d'autres) ici https://github.com/sinizinairina/mono/blob/master/mono.coffee
C'est le seul endroit lorsque vous avez à dire Cio quoi faire, après que tous les composants seront créés et câblé automatiquement et vous n'avez pas à voir du Cio code spécifique dans votre application plus.
Le Cio lui-même https://github.com/alexeypetrushin/miconjs
Je pense que nous avons encore besoin de l'Injection de Dépendance dans Nodejs parce qu'il desserre les dépendances entre les services et de faire une demande de plus en plus clairement.
Inspiré par Spring Framework, j'ai aussi implémenter mon propre module de soutien de l'injection de dépendances dans Nodejs. Mon module est également capable de détecter la
code changes
etauto reload
les services sans redémarrer votre application.Visiter mon projet: Buncha - conteneur IoC
Merci!
Il dépend de la conception de votre application. Vous pouvez évidemment faire un java comme l'injection d'où vous créez un objet d'une classe à la dépendance passé dans le constructeur de ce genre.
Si vous n'êtes pas de faire de la POO en javascript, vous pouvez faire une fonction init qui met tout en place.
Cependant, il y a une autre approche que vous pouvez prendre qui est plus fréquent dans un événement tel système node.js. Si vous pouvez le modèle qui vous demande seulement(la plupart du temps) loi sur les événements puis tout ce que vous devez faire est de mettre tout en place(qui j'ai l'habitude de le faire en appelant une fonction init) et émettent des événements à partir d'une souche. Cela fait des tests assez facile et lisible.
Ont un coup d'oeil à dips (Un simple mais puissant de l'injection de dépendances et de l'entité (fichier) cadre de gestion pour Node.js)
https://github.com/devcrust/node-dips
Google di.js fonctionne sur nodejs (+ navigateur) (+ ES6)
J'ai récemment créé une bibliothèque appelée circuitbox qui vous permet d'utiliser l'injection de dépendance avec node.js. Il n'vrai injection de dépendance contre de nombreux de la dépendance de la recherche basée sur les bibliothèques que j'ai vu. Circuitbox soutient également la création asynchrone et les routines d'initialisation. Ci-dessous est un exemple:
Assumer le code suivant dans un fichier appelé consoleMessagePrinter.js
Supposons que celui-ci est dans le fichier main.js
Circuitbox vous permet de définir vos composants et de déclarer les dépendances entre les modules. Une fois initialisé, il vous permet de récupérer un composant. Circuitbox injecte automatiquement tous les éléments le composant cible implique et donne à vous pour utiliser.
Le projet est en version alpha. Vos commentaires, idées et commentaires sont les bienvenus.
Espère que cela aide!
Je pense que les autres postes ont fait un excellent travail dans l'argument pour l'utilisation de DI. Pour moi, les raisons sont
Injecter des dépendances sans connaître leurs chemins d'accès. Cela signifie que si vous modifiez un module de l'emplacement sur le disque ou l'échanger avec un autre, vous n'avez pas besoin de toucher à tous les fichiers qui en dépendent.
Elle rend beaucoup plus facile de se moquer des dépendances pour les essais sans la douleur de la substitution de la global
require
fonction d'une manière qui fonctionne sans problèmes.Cela vous aide à organiser et à raison à propos de l'application que faiblement couplé modules.
Mais j'avais vraiment du mal à trouver un DI-cadre que mon équipe et moi-même pouvez facilement adopter. Donc, j'ai récemment construit un cadre appelé deppie sur la base de ces caractéristiques
require
modulesIl devrait être flexible et simple comme ceci:
J'ai écrit l'article sur l'Injection de Dépendance dans node.js.
J'espère que cela peut vous aider avec ceci.
Node.js nécessite DI autant que n'importe quelle autre plate-forme. Si vous êtes à la construction de quelque chose de grand, DI sera plus facile de se moquer des dépendances de votre code et tester votre code à fond.
Votre base de données de la couche de modules par exemple, il ne suffit pas d'obtenir nécessaire à votre entreprise des modules de code parce que, lors de tests unitaires de ces modules de code, le daos se charge et se connecter à la base de données.
Une solution serait de passer de la dépendance des paramètres du module:
De cette façon, les dépendances peuvent être moqué facilement et naturellement et vous pouvez rester concentré sur le test de votre code, sans l'aide de toute délicate 3ème partie de la bibliothèque.
Il y a d'autres solutions (broadway, architecte, etc) qui peut vous aider avec ceci. bien qu'ils peuvent faire plus que ce que vous voulez ou utiliser le désordre.
J'ai développé une bibliothèque qui gère l'injection de dépendance avec une manière simple, ce qui diminue le code réutilisable. Chaque module est défini par un nom unique et une fonction de contrôleur. Les paramètres du contrôleur reflète le module de dépendances.
Lire plus sur KlarkJS
Bref exemple:
myModuleName1
est le nom du module.$nodeModule1
est une bibliothèque externe denode_module
. Le nom correspond ànode-module1
. Le préfixe$
indique que c'est un module externe.myModuleName2
est le nom d'un module interne.myModuleName1
.J'ai découvert cette question, tout en répondant à une question sur mon propre DI module demander pourquoi on aurait besoin d'un DI système pour NodeJS programmation.
La réponse était clairement tendance à celles données dans ce fil: il dépend. Il existe des échanges de ces deux approches et la lecture de cette question, les réponses de donner une bonne forme de leur.
Donc, la vraie réponse à cette question devrait être que, dans certaines situations, vous devez utiliser une DI système, dans d'autres non.
Cela dit, ce que vous voulez comme un développeur est de ne pas se répéter et de réutiliser vos services au travers de vos différentes applications.
Cela signifie que nous devrions écrire des services qui sont prêts à être utilisés dans les DI système, mais pas lié à DI bibliothèques. Pour moi, cela signifie que nous devrions écrire des services comme ceci:
De cette façon, votre service de travaux a pas d'importance si vous l'utilisez avec ou
sans DI outil.
J'ai travaillé avec .Net, PHP et Java pour le temps long donc je voulais avoir une pratique de l'Injection de Dépendances dans NodeJS trop. Les gens, a déclaré le haut-DI dans NodeJS est assez comme nous pouvons l'obtenir avec le Module. Mais il ne me satisfont pas bien. Je voulais garder un Module de pas plus d'une Classe. En outre, je voulais que le DI d'avoir un support complet pour le Module de gestion du cycle de vie (singleton module, transitoire module etc.) mais avec le Noeud module, j'ai eu à écrire du code manuel, très souvent. Enfin, je voulais faire de l'Unité de Test plus facile. C'est pourquoi j'ai créé une Injection de Dépendance pour moi.
Si vous êtes à la recherche d'un DI, lui donner un essai. Il peut être trouvé ici: https://github.com/robo-creative/nodejs-robo-container. Il est entièrement documenté. Il aborde également certains des problèmes communs à la DI et de la façon de les résoudre en POO façon. Espérons que cela aide.
TypeDI est le plus doux de tous mentionnés ici, regardez ce code dans TypeDI
Look de ce code aussi: