Saat ini saya membuat beberapa proyek eksperimental dengan nodejs. Saya telah memprogram banyak aplikasi web Java EE dengan Spring dan menghargai kemudahan injeksi ketergantungan di sana.
Sekarang saya ingin tahu: Bagaimana cara saya melakukan injeksi ketergantungan dengan simpul? Atau: Apakah saya membutuhkannya? Apakah ada konsep pengganti, karena gaya pemrogramannya berbeda?
Saya berbicara tentang hal-hal sederhana, seperti berbagi objek koneksi database, sejauh ini, tetapi saya belum menemukan solusi yang memuaskan saya.
Jawaban:
Singkatnya, Anda tidak memerlukan wadah injeksi ketergantungan atau penyedia layanan seperti yang Anda lakukan di C # / Java. Sejak Node.js, memanfaatkan
module pattern
, tidak perlu melakukan konstruktor atau injeksi properti. Meskipun kamu masih bisa.Hal hebat tentang JS adalah Anda dapat memodifikasi apa saja untuk mencapai apa yang Anda inginkan. Ini sangat berguna ketika datang ke pengujian.
Lihatlah contoh buat saya yang sangat timpang.
MyClass.js
:MyClass.test.js
:Perhatikan bagaimana
MyClass
tergantung padafs
modul? Seperti @ShatyemShekhar sebutkan, Anda memang bisa melakukan injeksi konstruktor atau properti seperti dalam bahasa lain. Tapi itu tidak perlu di Javascript.Dalam hal ini, Anda dapat melakukan dua hal.
Anda dapat mematikan
fs.readdirSync
metode atau Anda dapat mengembalikan modul yang sama sekali berbeda saat Anda meneleponrequire
.Metode 1:
Metode 2:
Kuncinya adalah memanfaatkan kekuatan Node.js dan Javascript. Catatan, saya seorang pria CoffeeScript, jadi sintaks JS saya mungkin salah di suatu tempat. Juga, saya tidak mengatakan bahwa ini adalah cara terbaik, tetapi ini adalah cara. Guru Javascript mungkin bisa berbaur dengan solusi lain.
Memperbarui:
Ini harus menjawab pertanyaan spesifik Anda tentang koneksi basis data. Saya akan membuat modul terpisah untuk Anda untuk merangkum logika koneksi database Anda. Sesuatu seperti ini:
MyDbConnection.js
: (pastikan untuk memilih nama yang lebih baik)Kemudian, modul apa pun yang membutuhkan koneksi database kemudian hanya akan menyertakan
MyDbConnection
modul Anda .SuperCoolWebApp.js
:Jangan ikuti contoh ini kata demi kata. Ini adalah contoh lemah dalam mencoba berkomunikasi bahwa Anda memanfaatkan
module
pola untuk mengelola dependensi Anda. Semoga ini sedikit membantu.sumber
require('my_logger_library')
, orang yang menggunakan komponen saya harus menimpa keharusan untuk menggunakan perpustakaan mereka sendiri. Sebagai gantinya, saya dapat mengizinkan orang untuk melewati callback yang membungkus implementasi logger ke komponen "konstruktor" atau "init" metode. Itulah tujuan DI.require
adalah dengan cara mengelola dependensi di Node.js dan pasti itu adalah intuitif dan efektif, tetapi juga memiliki keterbatasan.Saran saya adalah untuk melihat beberapa wadah Ketergantungan Injeksi yang tersedia hari ini untuk Node.js untuk memiliki gagasan tentang apa pro / kontra mereka. Beberapa dari mereka adalah:
Untuk beberapa nama.
Sekarang pertanyaan sebenarnya adalah, apa yang bisa Anda capai dengan wadah DI Node.js, dibandingkan dengan yang sederhana
require
?Pro:
Cons:
require
pasti terasa seperti Anda menyimpang dari cara berpikir Node.Seperti halnya apa pun yang terkait dengan pengembangan perangkat lunak, memilih antara DI atau
require
tergantung pada kebutuhan Anda, kompleksitas sistem Anda, dan gaya pemrograman Anda.sumber
Saya tahu utas ini cukup lama pada saat ini, tetapi saya pikir saya akan berpadu dengan pemikiran saya tentang ini. TL; DR adalah bahwa karena sifat JavaScript yang tidak diketik dan dinamis, Anda sebenarnya dapat melakukan cukup banyak tanpa menggunakan pola ketergantungan injeksi (DI) atau menggunakan kerangka kerja DI. Namun, ketika aplikasi tumbuh lebih besar dan lebih kompleks, DI pasti dapat membantu pemeliharaan kode Anda.
DI dalam C #
Untuk memahami mengapa DI tidak sebesar kebutuhan dalam JavaScript, sangat membantu untuk melihat bahasa yang sangat diketik seperti C #. (Permintaan maaf kepada mereka yang tidak tahu C #, tetapi seharusnya cukup mudah untuk diikuti.) Katakanlah kita memiliki aplikasi yang menggambarkan mobil dan klaksonnya. Anda akan mendefinisikan dua kelas:
Ada beberapa masalah dengan penulisan kode dengan cara ini.
Car
kelas erat digabungkan dengan pelaksanaan tertentu dari tanduk diHorn
kelas. Jika kita ingin mengubah jenis klakson yang digunakan oleh mobil, kita harus memodifikasiCar
kelasnya meskipun penggunaan klakson tidak berubah. Ini juga membuat pengujian sulit karena kita tidak dapat mengujiCar
kelas secara terpisah dari ketergantungannya,Horn
kelas.Car
kelas bertanggung jawab untuk siklus hidup dariHorn
kelas. Dalam contoh sederhana seperti ini bukan masalah besar, tetapi dalam aplikasi nyata dependensi akan memiliki dependensi, yang akan memiliki dependensi, dll.Car
Kelas akan perlu bertanggung jawab untuk membuat seluruh pohon dependensi. Ini tidak hanya rumit dan berulang, tetapi juga melanggar "tanggung jawab tunggal" kelas. Seharusnya fokus pada menjadi mobil, bukan menciptakan instance.Sekarang, mari kita refactor ini untuk menggunakan pola injeksi ketergantungan.
Kami telah melakukan dua hal penting di sini. Pertama, kami telah memperkenalkan antarmuka yang
Horn
mengimplementasikan kelas kami . Ini memungkinkan kita mengkodekanCar
kelas ke antarmuka alih-alih implementasi tertentu. Sekarang kode dapat mengambil apa pun yang mengimplementasikanIHorn
. Kedua, kami telah mengambil instantiasi klaksonCar
dan membagikannya. Ini menyelesaikan masalah di atas dan membiarkannya ke fungsi utama aplikasi untuk mengelola instance spesifik dan siklus hidupnya.Apa artinya ini yang akan memperkenalkan klakson tipe baru untuk digunakan mobil tanpa menyentuh
Car
kelas:Main hanya bisa menyuntikkan instance
FrenchHorn
kelas sebagai gantinya. Ini juga secara dramatis menyederhanakan pengujian. Anda bisa membuatMockHorn
kelas untuk disuntikkan keCar
konstruktor untuk memastikan Anda menguji hanyaCar
kelas secara terpisah.Contoh di atas menunjukkan injeksi ketergantungan manual. Biasanya DI dilakukan dengan kerangka kerja (misalnya Unity atau Ninject di dunia C #). Kerangka kerja ini akan melakukan semua kabel dependensi untuk Anda dengan menapaki grafik dependensi Anda dan membuat instance yang diperlukan.
Cara Node.js Standar
Sekarang mari kita lihat contoh yang sama di Node.js. Kami mungkin akan memecah kode kami menjadi 3 modul:
Karena JavaScript tidak diketik, kami tidak memiliki kopling ketat yang sama seperti yang kami miliki sebelumnya. Tidak perlu antarmuka (juga tidak ada) karena
car
modul hanya akan mencoba memanggilhonk
metode apa pun yanghorn
diekspor modul.Selain itu, karena
require
cache Node semuanya, modul pada dasarnya adalah lajang yang disimpan dalam sebuah wadah. Modul lain yang melakukanrequire
padahorn
modul akan mendapatkan contoh yang sama persis. Ini membuat berbagi objek tunggal seperti koneksi basis data sangat mudah.Sekarang masih ada masalah bahwa
car
modul bertanggung jawab untuk mengambil ketergantungannya sendirihorn
. Jika Anda ingin mobil menggunakan modul berbeda untuk klaksonnya, Anda harus mengubahrequire
pernyataan dicar
modul. Ini bukan hal yang sangat umum untuk dilakukan, tetapi hal itu menyebabkan masalah dengan pengujian.Cara biasa orang menangani masalah pengujian adalah dengan proxyquire . Karena sifat dinamis dari JavaScript, proksi meminta intersep panggilan untuk meminta dan mengembalikan setiap bertopik / mengejek yang Anda berikan.
Ini lebih dari cukup untuk sebagian besar aplikasi. Jika itu berfungsi untuk aplikasi Anda, maka ikutilah. Namun, dalam pengalaman saya ketika aplikasi tumbuh lebih besar dan lebih kompleks, mempertahankan kode seperti ini menjadi lebih sulit.
DI dalam JavaScript
Node.js sangat fleksibel. Jika Anda tidak puas dengan metode di atas, Anda dapat menulis modul menggunakan pola injeksi ketergantungan. Dalam pola ini, setiap modul mengekspor fungsi pabrik (atau konstruktor kelas).
Ini sangat analog dengan metode C # sebelumnya dalam
index.js
modul yang bertanggung jawab untuk siklus hidup dan kabel misalnya. Pengujian unit cukup sederhana karena Anda bisa mengoper / bertopik pada fungsi. Sekali lagi, jika ini cukup baik untuk aplikasi Anda, ikutilah.Kerangka Kerja Bolus DI
Tidak seperti C #, tidak ada kerangka kerja DI standar yang ditetapkan untuk membantu manajemen ketergantungan Anda. Ada sejumlah kerangka kerja dalam registri npm tetapi tidak ada yang memiliki adopsi luas. Banyak dari opsi ini telah dikutip di jawaban lain.
Saya tidak terlalu senang dengan salah satu opsi yang tersedia jadi saya menulis bolus saya sendiri . Bolus dirancang untuk bekerja dengan kode yang ditulis dengan gaya DI di atas dan mencoba menjadi sangat KERING dan sangat sederhana. Dengan menggunakan modul
car.js
danhorn.js
modul yang sama persis di atas, Anda dapat menulis ulangindex.js
modul dengan bolus sebagai:Ide dasarnya adalah Anda membuat injektor. Anda mendaftarkan semua modul Anda di injektor. Maka Anda cukup menyelesaikan apa yang Anda butuhkan. Bolus akan menjalankan grafik dependensi dan membuat serta menyuntikkan dependensi sesuai kebutuhan. Anda tidak menyimpan banyak dalam contoh mainan seperti ini, tetapi dalam aplikasi besar dengan pohon ketergantungan yang rumit, penghematannya sangat besar.
Bolus mendukung banyak fitur bagus seperti dependensi opsional dan uji global, tetapi ada dua manfaat utama yang saya lihat relatif terhadap pendekatan standar Node.js. Pertama, jika Anda memiliki banyak aplikasi serupa, Anda dapat membuat modul npm pribadi untuk basis Anda yang membuat injektor dan mendaftarkan objek yang berguna di dalamnya. Kemudian aplikasi spesifik Anda dapat menambah, menimpa, dan menyelesaikan sesuai kebutuhan seperti cara AngularJSinjektor bekerja. Kedua, Anda dapat menggunakan bolus untuk mengelola berbagai konteks dependensi. Misalnya, Anda bisa menggunakan middleware untuk membuat injektor anak per permintaan, mendaftarkan id pengguna, id sesi, logger, dll. Pada injektor bersama dengan modul apa pun tergantung pada mereka. Kemudian selesaikan apa yang Anda butuhkan untuk melayani permintaan. Ini memberi Anda contoh modul Anda per permintaan dan mencegah harus lulus logger, dll. Sepanjang setiap panggilan fungsi modul.
sumber
proxyquire
sepertisinon
yang memungkinkan Anda untuk melakukan ejekan yang sangat singkat, misalnyalet readFileStub = sinon.stub(fs, 'readFile').yields(new Error('something went wrong'));
dan kemudian panggilan berikutnyafs.readFile
akan mengembalikan kesalahan sampai Anda mengembalikan rintisan melaluireadFileStub.restore()
. Secara pribadi saya menemukan DI penggunaan yang dipertanyakan karena saya merasa hampir memerlukan penggunaan kelas / objek, yang merupakan asumsi yang meragukan mengingat kecenderungan fungsional javascript.jest
,rewire
,proxyquire
, dll? Terima kasih.Saya juga menulis modul untuk menyelesaikan ini, ini disebut rewire . Cukup gunakan
npm install rewire
dan kemudian:Saya terinspirasi oleh suntikan Nathan MacInnes tetapi menggunakan pendekatan yang berbeda. Saya tidak menggunakan
vm
eval modul-tes, pada kenyataannya saya menggunakan node sendiri membutuhkan. Dengan cara ini modul Anda berperilaku persis seperti menggunakanrequire()
(kecuali modifikasi Anda). Juga debugging didukung sepenuhnya.sumber
Saya membangun Elektrolit hanya untuk tujuan ini. Solusi injeksi ketergantungan lain di luar sana terlalu invasif untuk selera saya, dan mengacaukan dunia
require
adalah keluhan saya yang khusus.Elektrolit mencakup modul, khususnya yang mengekspor fungsi "pengaturan" seperti yang Anda lihat di Connect / Express middleware. Pada dasarnya, jenis modul ini hanyalah pabrik untuk beberapa objek yang mereka kembalikan.
Misalnya, modul yang membuat koneksi basis data:
Apa yang Anda lihat di bagian bawah adalah anotasi , metadata ekstra yang digunakan Elektrolit untuk membuat instance dan menyuntikkan dependensi, secara otomatis menghubungkan komponen aplikasi Anda bersama-sama.
Untuk membuat koneksi database:
Elektrolit secara transitif melintasi
@require
dependensi d, dan menyuntikkan instance sebagai argumen ke fungsi yang diekspor.Kuncinya adalah ini invasif minimal. Modul ini sepenuhnya dapat digunakan, independen dari Elektrolit itu sendiri. Itu berarti unit test Anda dapat menguji hanya modul yang diuji , melewati benda tiruan tanpa perlu ketergantungan tambahan untuk memasang ulang internal.
Saat menjalankan aplikasi lengkap, Elektrolit masuk pada level antar-modul, menghubungkan berbagai hal tanpa perlu global, lajang atau pipa ledeng yang berlebihan.
sumber
connect()
melempar? Meskipun saya tidak terbiasa dengan MySql API untuk Node, saya berharap panggilan ini tidak sinkron, sehingga ilustrasinya tidak begitu jelas.ioc.create
dari unit test. Tes unit harus menguji hanya modul yang diuji, dan tidak membawa dependensi lain, termasuk Elektrolit. Mengikuti saran ini, Anda akan melakukannyaobjToTest = require('modulename')(mockObj1, mockObj2);
Saya melihat ini sendiri. Saya tidak suka memperkenalkan pustaka dependensi sulap utilitas yang menyediakan mekanisme untuk membajak impor modul saya. Sebaliknya saya datang dengan "pedoman desain" untuk tim saya untuk secara eksplisit menyatakan dependensi apa yang dapat diejek dengan memperkenalkan ekspor fungsi pabrik dalam modul saya.
Saya menggunakan banyak fitur ES6 untuk parameter dan perusakan untuk menghindari boilerplate dan menyediakan mekanisme override dependensi.
Berikut ini sebuah contoh:
Dan berikut adalah contoh penggunaannya
Maafkan sintaks ES6 bagi mereka yang tidak terbiasa dengannya.
sumber
Saya baru-baru ini memeriksa utas ini dengan alasan yang hampir sama dengan OP - sebagian besar lib yang saya temui untuk sementara menulis ulang pernyataan yang diperlukan. Saya memiliki tingkat keberhasilan yang beragam dengan metode ini, dan akhirnya saya menggunakan pendekatan berikut.
Dalam konteks aplikasi ekspres - saya bungkus app.js dalam file bootstrap.js:
Peta objek yang dilewatkan ke loader terlihat seperti ini:
Maka, daripada langsung menelepon membutuhkan ...
Jika tidak ada alias yang terletak di loader - maka hanya akan default ke kebutuhan reguler. Ini memiliki dua manfaat: Saya dapat menukar versi versi apa pun dari kelas, dan ini menghilangkan kebutuhan untuk menggunakan nama jalur relatif di seluruh aplikasi (jadi Jika saya memerlukan lib khusus di bawah atau di atas file saat ini, saya tidak perlu melintasi , dan akan meminta cache modul terhadap tombol yang sama). Ini juga memungkinkan saya untuk menentukan ejekan pada titik mana saja di aplikasi, daripada di suite tes langsung.
Saya baru saja menerbitkan modul npm kecil untuk kenyamanan:
https://npmjs.org/package/nodejs-simple-loader
sumber
Kenyataannya adalah bahwa Anda dapat menguji node.js Anda tanpa wadah IoC karena JavaScript adalah bahasa pemrograman yang benar-benar dinamis dan Anda dapat memodifikasi hampir semua hal saat dijalankan.
Pertimbangkan yang berikut ini:
Jadi Anda bisa mengganti kopling antar komponen saat run-time. Saya suka berpikir bahwa kita harus bertujuan untuk memisahkan modul JavaScript kita.
Satu-satunya cara untuk mencapai decoupling nyata adalah dengan menghapus referensi ke
UserRepository
:Ini berarti bahwa di tempat lain Anda perlu melakukan komposisi objek:
Saya suka ide mendelegasikan komposisi objek ke wadah IoC. Anda dapat mempelajari lebih lanjut tentang ide ini di artikel Keadaan terbalik ketergantungan saat ini di JavaScript . Artikel ini mencoba menyanggah beberapa "mitos wadah IoC JavaScript":
Jika Anda juga menyukai gagasan menggunakan wadah IOC Anda bisa melihat ke InversifyJS. Rilis terbaru (2.0.0) mendukung banyak kasus penggunaan:
Anda dapat mempelajari lebih lanjut di InversifyJS .
sumber
Untuk ES6 saya mengembangkan wadah ini https://github.com/zazoomauro/node-dependency-injection
Kemudian Anda dapat mengatur, misalnya, pilihan transportasi dalam wadah:
Kelas ini sekarang jauh lebih fleksibel karena Anda telah memisahkan pilihan transportasi dari implementasi dan ke dalam wadah.
Sekarang layanan mailer ada di dalam kontainer, Anda dapat menyuntikkannya sebagai dependensi kelas lain. Jika Anda memiliki kelas NewsletterManager seperti ini:
Saat mendefinisikan layanan newsletter_manager, layanan mailer belum ada. Gunakan kelas Referensi untuk memberi tahu wadah untuk menyuntikkan layanan mailer ketika itu menginisialisasi manajer buletin:
Anda juga dapat mengatur wadah dengan file konfigurasi seperti file Yaml, Json atau JS
Wadah layanan dapat dikompilasi karena berbagai alasan. Alasan-alasan ini termasuk memeriksa untuk setiap masalah potensial seperti referensi melingkar dan membuat wadah lebih efisien.
sumber
Itu tergantung pada desain aplikasi Anda. Anda jelas dapat melakukan injeksi seperti java di mana Anda membuat objek kelas dengan dependensi yang diteruskan dalam konstruktor seperti ini.
Jika Anda tidak melakukan OOP dalam javascript, Anda dapat membuat fungsi init yang mengatur semuanya.
Namun, ada pendekatan lain yang dapat Anda ambil yang lebih umum dalam sistem berbasis acara seperti node.js. Jika Anda dapat memodelkan aplikasi Anda untuk hanya (sebagian besar waktu) bertindak berdasarkan peristiwa maka yang perlu Anda lakukan adalah mengatur semuanya (yang biasanya saya lakukan dengan memanggil fungsi init) dan memancarkan peristiwa dari sebuah rintisan. Ini membuat pengujian lebih mudah dan mudah dibaca.
sumber
Saya selalu menyukai kesederhanaan konsep IoC - "Anda tidak perlu tahu apa-apa tentang lingkungan, Anda akan dipanggil oleh seseorang ketika dibutuhkan"
Tetapi semua implementasi IoC yang saya lihat melakukan sebaliknya - mereka mengacaukan kode dengan lebih banyak hal daripada tanpa itu. Jadi, saya membuat IoC saya sendiri yang berfungsi seperti yang saya inginkan - ia tetap tersembunyi dan tidak terlihat 90% dari waktu .
Ini digunakan dalam kerangka web MonoJS http://monojs.org
Ini dilakukan seperti ini - register komponen sekali dalam konfigurasi.
Dan gunakan di mana saja
Anda dapat melihat kode definisi komponen lengkap (dengan Koneksi DB dan Komponen lainnya) di sini https://github.com/sinizinairina/mono/blob/master/mono.coffee
Ini adalah satu-satunya tempat ketika Anda harus memberitahu IoC apa yang harus dilakukan, setelah itu semua komponen akan dibuat dan ditransfer secara otomatis dan Anda tidak perlu melihat kode spesifik IoC dalam aplikasi Anda lagi.
IoC itu sendiri https://github.com/alexeypetrushin/miconjs
sumber
Saya pikir kita masih memerlukan Ketergantungan Injeksi di Nodejs karena itu melonggarkan ketergantungan antara layanan dan membuat aplikasi lebih jelas.
Terinspirasi oleh Spring Framework , saya juga mengimplementasikan modul saya sendiri untuk mendukung injeksi dependensi di Nodejs. Modul saya juga dapat mendeteksi
code changes
danauto reload
layanan tanpa me-restart aplikasi Anda.Kunjungi proyek saya di: Buncha - wadah IoC
Terima kasih!
sumber
Lihatlah dips (injeksi dependensi dan kerangka kerja entitas (file) yang sederhana namun kuat untuk Node.js)
https://github.com/devcrust/node-dips
sumber
Saya bekerja dengan .Net, PHP dan Java untuk waktu yang lama jadi saya ingin memiliki Dependency Injection yang nyaman di NodeJS juga. Orang-orang mengatakan DI built-in di NodeJS sudah cukup karena kita bisa mendapatkannya dengan Module. Tapi itu tidak memuaskan saya dengan baik. Saya ingin menyimpan Modul tidak lebih dari Kelas. Selain itu, saya ingin DI memiliki dukungan penuh untuk manajemen siklus hidup Modul (modul singleton, modul transient, dll.) Tetapi dengan modul Node, saya harus sering menulis kode manual. Terakhir, saya ingin membuat Unit Test lebih mudah. Itu sebabnya saya membuat Injeksi Ketergantungan untuk diri saya sendiri.
Jika Anda mencari DI, cobalah. Itu dapat ditemukan di sini: https://github.com/robo-creative/nodejs-robo-container . Ini sepenuhnya didokumentasikan. Ini juga membahas beberapa masalah umum dengan DI dan cara menyelesaikannya dengan cara OOP. Semoga ini bisa membantu.
sumber
Saya baru-baru ini membuat perpustakaan bernama circuitbox yang memungkinkan Anda untuk menggunakan dependensi-injeksi dengan node.js. Itu benar ketergantungan-injeksi vs banyak perpustakaan berbasis dependensi-lookup yang telah saya lihat. Circuitbox juga mendukung kreasi dan sinkronisasi inisialisasi asinkron. Di bawah ini adalah contohnya:
Asumsikan kode berikut ini dalam file yang disebut consoleMessagePrinter.js
Asumsikan yang berikut ini ada di file main.js
Circuitbox memungkinkan Anda mendefinisikan komponen Anda dan mendeklarasikan dependensinya sebagai modul. Setelah diinisialisasi, ini memungkinkan Anda untuk mengambil komponen. Circuitbox secara otomatis menyuntikkan semua komponen yang dibutuhkan komponen target dan memberikannya kepada Anda untuk digunakan.
Proyek ini dalam versi alpha. Komentar, ide, dan umpan balik Anda dipersilakan.
Semoga ini bisa membantu!
sumber
Saya pikir posting lain telah melakukan pekerjaan yang bagus dalam argumen untuk menggunakan DI. Bagi saya alasannya adalah
Suntikkan dependensi tanpa mengetahui jalurnya. Ini berarti bahwa jika Anda mengubah lokasi modul pada disk atau bertukar dengan yang lain, Anda tidak perlu menyentuh setiap file yang bergantung padanya.
Itu membuatnya jauh lebih mudah untuk mengejek dependensi untuk pengujian tanpa rasa sakit mengesampingkan
require
fungsi global dengan cara yang bekerja tanpa masalah.Ini membantu Anda mengatur dan alasan tentang aplikasi Anda sebagai modul yang digabungkan secara longgar.
Tetapi saya mengalami kesulitan menemukan kerangka DI yang dapat saya dan tim saya adopsi dengan mudah. Jadi saya baru-baru ini membangun kerangka kerja yang disebut deppie berdasarkan fitur-fitur ini
require
modulsumber
Itu harus fleksibel dan sederhana seperti ini:
Saya telah menulis artikel tentang Dependency Injection di node.js.
Saya harap ini dapat membantu Anda dengan ini.
sumber
Node.js membutuhkan DI sebanyak platform lainnya. Jika Anda membangun sesuatu yang besar, DI akan membuatnya lebih mudah untuk mengejek dependensi kode Anda dan menguji kode Anda secara menyeluruh.
Modul-modul layer database Anda misalnya, tidak seharusnya hanya diperlukan di modul kode bisnis Anda karena, ketika unit menguji modul-modul kode bisnis ini, daos akan dimuat dan terhubung ke database.
Salah satu solusinya adalah dengan melewatkan dependensi sebagai parameter modul:
Dengan cara ini dependensi dapat diejek dengan mudah dan alami dan Anda dapat tetap fokus pada pengujian kode Anda, tanpa menggunakan pustaka pihak ke-3 yang rumit.
Ada solusi lain di luar sana (broadway, arsitek dll) yang dapat membantu Anda dengan ini. meskipun mereka dapat melakukan lebih dari apa yang Anda inginkan atau menggunakan lebih banyak kekacauan.
sumber
Saya telah mengembangkan perpustakaan yang menangani injeksi ketergantungan dengan cara sederhana, yang mengurangi kode boilerplate. Setiap modul ditentukan oleh nama unik dan fungsi pengontrol. Parameter controller mencerminkan dependensi modul.
Baca lebih lanjut tentang KlarkJS
Contoh singkat:
myModuleName1
adalah nama modul.$nodeModule1
adalah perpustakaan eksternal darinode_module
. Nama memutuskan untuknode-module1
. Awalan$
menunjukkan bahwa itu adalah modul eksternal.myModuleName2
adalah nama modul internal.myModuleName1
.sumber
Saya menemukan pertanyaan ini ketika menjawab masalah pada modul DI saya sendiri dan bertanya mengapa seseorang membutuhkan sistem DI untuk pemrograman NodeJS.
Jawabannya jelas cenderung pada yang diberikan di utas ini: itu tergantung. Ada trade-off untuk kedua pendekatan dan membaca jawaban pertanyaan ini memberikan bentuk yang baik dari mereka.
Jadi, jawaban sebenarnya untuk pertanyaan ini, semestinya dalam beberapa situasi, Anda akan menggunakan sistem DI, di lain tidak.
Yang mengatakan, apa yang Anda inginkan sebagai pengembang adalah tidak mengulangi sendiri dan menggunakan kembali layanan Anda di berbagai aplikasi Anda.
Ini berarti bahwa kita harus menulis layanan yang siap digunakan dalam sistem DI tetapi tidak terikat pada perpustakaan DI. Bagi saya, itu berarti bahwa kita harus menulis layanan seperti ini:
Dengan begitu layanan Anda berfungsi tidak masalah jika Anda menggunakannya dengan atau tanpa alat DI.
sumber
TypeDI adalah yang paling manis dari semua yang disebutkan di sini, lihat kode ini di TypeDI
Lihat kode ini juga:
sumber