Saya telah melihat istilah injeksi konstruktor dan injeksi ketergantungan saat membaca artikel tentang pola desain (Layanan locator).
Ketika saya mencari Google di injeksi konstruktor, saya mendapat hasil yang tidak jelas, yang mendorong saya untuk check in di sini.
Apa itu injeksi konstruktor? Apakah ini tipe injeksi ketergantungan khusus? Contoh kanonik akan sangat membantu!
Sunting
Meninjau kembali pertanyaan-pertanyaan ini setelah jeda seminggu, saya dapat melihat betapa tersesatnya saya ... Kalau-kalau ada orang lain muncul di sini, saya akan memperbarui tubuh pertanyaan dengan sedikit belajar dari saya. Silahkan berkomentar / koreksi. Injeksi konstruktor dan injeksi properti adalah dua jenis Injeksi Ketergantungan.
c#
dependency-injection
TheSilverBullet
sumber
sumber
Jawaban:
Saya bukan ahli, tapi saya pikir saya bisa membantu. Dan ya, itu adalah tipe Injeksi Ketergantungan khusus.
Penafian: Hampir semua ini "dicuri" dari Ninject Wiki
Mari kita periksa ide injeksi ketergantungan dengan berjalan melalui contoh sederhana. Katakanlah Anda sedang menulis game blockbuster berikutnya, di mana para prajurit bangsawan melakukan pertempuran untuk kemuliaan besar. Pertama, kita akan membutuhkan senjata yang cocok untuk mempersenjatai prajurit kita.
Lalu, mari kita buat kelas untuk mewakili prajurit kita sendiri. Untuk menyerang lawannya, prajurit akan membutuhkan metode Serangan (). Ketika metode ini dipanggil, ia harus menggunakan Pedangnya untuk menyerang lawannya.
Sekarang, kita bisa membuat Samurai kita dan melakukan pertempuran!
Seperti yang mungkin Anda bayangkan, ini akan mencetak Cincang para penjahat bersih setengah menjadi konsol. Ini bekerja dengan baik, tetapi bagaimana jika kita ingin mempersenjatai Samurai kita dengan senjata lain? Karena Pedang dibuat di dalam konstruktor kelas Samurai, kita harus memodifikasi implementasi kelas untuk membuat perubahan ini.
Ketika suatu kelas tergantung pada ketergantungan konkret, itu dikatakan tergabung erat dengan kelas itu . Dalam contoh ini, kelas Samurai sangat erat dengan kelas Pedang. Ketika kelas-kelas digabungkan secara ketat, mereka tidak dapat dipertukarkan tanpa mengubah implementasinya. Untuk menghindari kelas kopling ketat, kita dapat menggunakan antarmuka untuk memberikan tingkat tipuan. Mari kita buat antarmuka untuk mewakili senjata di gim kita.
Kemudian, kelas Sword kami dapat mengimplementasikan antarmuka ini:
Dan kita dapat mengubah kelas Samurai kita:
Sekarang Samurai kita dapat dipersenjatai dengan senjata yang berbeda. Tapi tunggu! Pedang masih dibuat di dalam konstruktor Samurai. Karena kita masih perlu mengubah implementasi Samurai untuk memberikan prajurit kita senjata lain, Samurai masih tergabung erat dengan Sword.
Untungnya, ada solusi mudah. Daripada menciptakan Pedang dari dalam konstruktor Samurai, kita dapat mengeksposnya sebagai parameter konstruktor sebagai gantinya. Juga dikenal sebagai Injeksi Konstruktor.
Seperti yang ditunjukkan Giorgio, ada juga injeksi properti. Itu akan menjadi sesuatu seperti:
Semoga ini membantu.
sumber
Saya akan berusaha semaksimal mungkin untuk membuat ini sangat dasar. Dengan begitu, Anda dapat membangun konsep dan membuat solusi atau ide kompleks Anda sendiri.
Sekarang bayangkan kita memiliki sebuah gereja bernama Jubilee, yang memiliki cabang di seluruh dunia. Tujuan kami adalah mendapatkan item dari setiap cabang. Ini akan menjadi solusi dengan DI;
1) Buat antarmuka IJubilee:
2) Buat JubileeDI kelas yang akan menggunakan antarmuka IJubilee sebagai konstruktor dan mengembalikan item:
3) Sekarang buat tiga brache dari Jubilee yaitu JubileeGT, JubileeHOG, JubileeCOV, yang semuanya HARUS mewarisi antarmuka IJubilee. Untuk bersenang-senang, buat salah satu dari mereka mengimplementasikan metodenya sebagai virtual:
4) Itu dia! Sekarang mari kita lihat DI beraksi:
Untuk setiap instance dari kelas kontainer, kami melewati instance baru dari kelas yang kami butuhkan, yang memungkinkan kopling longgar.
Semoga ini menjelaskan konsepnya secara singkat.
sumber
Misalkan Anda memiliki kelas
A
setiap instance yang membutuhkan instance dari kelas lainB
.Ketergantungan injeksi berarti bahwa referensi ke
B
diatur oleh objek yang mengelola turunanA
(sebagai lawan memiliki kelas yangA
mengelola referensiB
secara langsung).Injeksi konstruktor berarti bahwa referensi untuk
B
diteruskan sebagai parameter untuk konstruktorA
dan ditetapkan dalam konstruktor:Alternatifnya adalah menggunakan metode setter (atau properti) untuk mengatur referensi
B
. Dalam hal ini, objek yang mengelola sebuah contoha
dariA
keharusan pertama memanggil konstruktor dariA
dan kemudian memanggil metode setter untuk mengatur variabel anggotaA.b
sebeluma
digunakan. Metode injeksi terakhir ini diperlukan ketika benda berisi referensi siklik satu sama lain, misalnya jika sebuah contohb
dariB
yang diatur dalam sebuah contoha
dariA
berisi referensi kembali kea
.** SUNTING**
Berikut adalah beberapa detail untuk menanggapi komentar.
1. Kelas A mengelola instance B
2. B instance diatur dalam konstruktor
3. B instance diatur menggunakan metode setter
sumber
itemA
atauobjectA
hanya untuk membuat nama lebih lama tidak selalu lebih baik.