Pertama, saya seorang programmer tingkat pemula; Bahkan, saya menyelesaikan gelar AS dengan proyek batu penjuru akhir selama musim panas. Dalam pekerjaan baru saya, ketika tidak ada proyek yang harus saya kerjakan (mereka sedang menunggu untuk mengisi tim dengan lebih banyak karyawan baru), saya telah diberikan buku untuk dibaca dan dipelajari dari saat saya menunggu - beberapa buku teks, yang lain tidak begitu banyak (seperti Code Complete). Setelah membaca buku-buku ini, saya beralih ke internet untuk belajar sebanyak mungkin, dan mulai belajar tentang SOLID dan DI (kami berbicara beberapa tentang prinsip substitusi Liskov, tetapi tidak banyak lagi ide SOLID). Jadi seperti yang telah saya pelajari, saya duduk untuk belajar lebih baik, dan mulai menulis beberapa kode untuk memanfaatkan DI dengan tangan (tidak ada kerangka kerja DI pada pengembangan komputer).
Masalahnya adalah, ketika saya melakukannya, saya perhatikan rasanya akrab ... dan sepertinya itu sangat mirip dengan pekerjaan yang saya lakukan di masa lalu menggunakan komposisi kelas abstrak menggunakan polimorfisme. Apakah saya melewatkan gambar yang lebih besar di sini? Apakah ada sesuatu tentang DI (setidaknya dengan tangan) yang melampaui itu? Saya memahami kemungkinan memiliki konfigurasi bukan dalam kode beberapa kerangka kerja DI yang memiliki manfaat besar sejauh mengubah hal-hal tanpa harus mengkompilasi ulang, tetapi ketika melakukannya dengan tangan, saya tidak yakin apakah itu berbeda dari yang disebutkan di atas ... Beberapa wawasan tentang ini akan sangat membantu!
sumber
Artikel terbaik yang pernah saya baca tentang topik ini adalah artikel James Shore . Saya telah melakukan " DI dengan Tangan " selama berabad-abad, sebagai bagian dari abstraksi dan polimorfisme. Jadi setelah saya masuk ke dunia profesional dan saya terus mendengar istilah itu dilontarkan, saya memiliki keterputusan yang besar antara apa yang saya pikir arti kata itu dan apa arti sebenarnya:
Itu dari pos Shore, yang membereskan semuanya untukku. Sebagai contoh:
Diberikan
Alih-alih menulis:
Anda menulis sesuatu seperti ini:
Dan ini mencegah
Car
instance dari harus menanganiEngine
detail spesifik . Mobil hanya membutuhkan mesin, tidak peduli yang mana asalkan menerapkan fungsionalitas Mesin dasar. Artinya,Car
kelas Anda tidak terikat dengan ketergantungan implementasi spesifik; itu "disuntikkan" di tempat lain, berpotensi saat runtime.Contoh Mobil khusus ini menggunakan sub-jenis DI yang disebut "Injeksi Konstruktor", yang berarti bahwa ketergantungan diserahkan sebagai argumen konstruktor. Anda juga dapat menggunakan
setEngine(Engine a)
metode untuk "Setter Injection", dan sebagainya, tetapi sub-tipe ini sepertinya terlalu bagus untuk saya.Namun, sedikit lebih jauh, banyak kerangka kerja DI menyediakan pelat untuk menghubungkan banyak hal yang lebih dirujuk secara abstrak satu sama lain.
Itu dia.
sumber
Saya bukan ahli karena saya baru mulai menggunakan DI dalam beberapa tahun terakhir, tetapi beberapa tema / fungsi berguna dari wadah DI yang saya perhatikan adalah (yang saya tidak menganggapnya sebagai produk komposisi / polimorfisme (tapi saya mungkin akan dikoreksi atas hal itu):
sumber
Terlepas dari DI, ada konfigurasi komposisi kelas di aplikasi root (bukannya mengkonfigurasi menggunakan xml). Tidak perlu untuk kerangka DI atau IoC, meskipun mereka dapat merapikan konfigurasi komposisi kelas, terutama untuk proyek-proyek besar. Ini karena kerangka kerja DI biasanya datang dengan wadah yang menerapkan fitur tambahan, seperti pengkabelan otomatis, yang membantu mengonfigurasi komposisi kelas. Anda dapat membaca entri blog saya untuk mengekstrak pemahaman saya tentang topik ini.
sumber