Saya telah melihat banyak referensi Dependency Injection (DI) & Inversion Of Control (IOC), tetapi saya tidak benar-benar tahu apakah ada perbedaan di antara mereka atau tidak.
Saya ingin mulai menggunakan satu atau keduanya, tetapi saya agak bingung bagaimana mereka berbeda.
Jawaban:
Definisi
Inversion of control adalah paradigma desain dengan tujuan mengurangi kesadaran implementasi konkret dari kode kerangka kerja aplikasi dan memberikan lebih banyak kontrol ke komponen domain spesifik aplikasi Anda. Dalam sistem yang dirancang top down tradisional, aliran logis aplikasi dan kesadaran ketergantungan mengalir dari komponen atas, komponen yang dirancang terlebih dahulu, ke komponen yang dirancang terakhir. Dengan demikian, inversi kontrol adalah pembalikan hampir literal dari kontrol dan kesadaran ketergantungan dalam suatu aplikasi.
Ketergantungan injeksi adalah pola yang digunakan untuk membuat instance kelas yang bergantung pada kelas lain tanpa mengetahui pada waktu kompilasi implementasi yang akan digunakan untuk menyediakan fungsionalitas itu.
Bekerja bersama
Inversi kontrol dapat memanfaatkan injeksi ketergantungan karena diperlukan mekanisme untuk membuat komponen yang menyediakan fungsi spesifik. Pilihan lain ada dan digunakan, misalnya aktivator, metode pabrik, dll., Tetapi kerangka kerja tidak perlu merujuk kelas-kelas utilitas ketika kelas kerangka kerja dapat menerima ketergantungan yang mereka butuhkan.
Contohnya
Salah satu contoh konsep-konsep ini di tempat kerja adalah kerangka plug-in di Reflector . Plug-in memiliki banyak kontrol terhadap sistem walaupun aplikasi tidak tahu apa-apa tentang plug-in pada waktu kompilasi. Metode tunggal dipanggil pada masing-masing plug-in tersebut, Inisialisasi jika memori berfungsi, yang meneruskan kontrol ke plug-in. Kerangka kerja tidak tahu apa yang akan mereka lakukan, itu hanya memungkinkan mereka melakukannya. Kontrol telah diambil dari aplikasi utama dan diberikan kepada komponen yang melakukan pekerjaan tertentu; inversi kontrol.
Kerangka kerja aplikasi memungkinkan akses ke fungsinya melalui berbagai penyedia layanan. Sebuah plug-in diberikan referensi ke penyedia layanan ketika itu dibuat. Ketergantungan ini memungkinkan plug-in untuk menambahkan item menu sendiri, mengubah cara file ditampilkan, menampilkan informasi sendiri di panel yang sesuai, dll. Karena dependensi dilewatkan oleh antarmuka, implementasinya dapat berubah dan perubahan tidak akan merusak kode selama kontrak tetap utuh.
Pada saat itu, metode pabrik digunakan untuk membuat plug-in menggunakan informasi konfigurasi, refleksi dan objek Activator (setidaknya dalam. NET). Saat ini, ada alat, MEF untuk satu, yang memungkinkan untuk berbagai pilihan ketika menyuntikkan dependensi termasuk kemampuan kerangka kerja aplikasi untuk menerima daftar plugin sebagai dependensi.
Ringkasan
Sementara konsep-konsep ini dapat digunakan dan memberikan manfaat secara mandiri, bersama-sama mereka memungkinkan penulisan kode yang lebih fleksibel, dapat digunakan kembali, dan dapat diuji. Dengan demikian, mereka adalah konsep penting dalam merancang solusi berorientasi objek.
sumber
Artikel bagus untuk memahami IOC dan DI http://martinfowler.com/articles/injection.html
IOC (Pembalikan Kontrol)
IOC artinya
pengkodean ke antarmuka (satu komponen harus bergantung pada antarmuka komponen lain dan bukan pada impl), dan mis
menghapus kode spesifik implementasi komponen misalnya
IOC dapat dicapai dengan salah satu dari berikut ini:
1. DI (Injeksi Ketergantungan)
2. Lokasi Layanan
Wadah DI (Dependency Injection)
Penentuan impl Runtime dan bukan waktu kompilasi: menentukan pada saat runtime implementasi konkret antarmuka mana yang akan digunakan berdasarkan beberapa file konfigurasi (jadi pada waktu kompilasi kita tidak tahu impl mana yang akan digunakan dan dengan demikian meningkatkan konfigurasi aplikasi) . Ini adalah implementasi di mana hubungan konkret antara modul yang berbeda diputuskan pada "run time".
Instansiasi impl setelah injeksi dependensi: setelah menentukan impl, instantiate yang mengimplementasikan dengan terlebih dahulu membuat semua dependensinya (ditentukan dalam file konfigurasi) dan kemudian menyuntikkan dependensi tersebut ke dalam impl tersebut
Manajemen siklus hidup Instance: Wadah DI biasanya hanya menyimpan referensi ke objek yang dibutuhkan untuk mengelola siklus hidup, atau yang digunakan kembali untuk injeksi di masa depan, seperti lajang atau bobot terbang. Ketika dikonfigurasikan untuk membuat instance baru dari beberapa komponen untuk setiap panggilan ke kontainer, kontainer biasanya hanya lupa tentang objek yang dibuat. Kalau tidak, pengumpul sampah akan kesulitan mengumpulkan semua benda-benda ini ketika tidak lagi digunakan.
sumber
Saya akan mengatakan "Pembalikan Kontrol" adalah cara untuk merancang sistem di mana semua modul dianggap entitas abstrak.
Dan, "Dependency Injection" adalah implementasi di mana hubungan konkret antara berbagai modul diputuskan pada "run time".
sumber
Inversi kontrol adalah konsep umum, dalam bahasa fungsional biasanya dilakukan dengan menggunakan kelanjutan. Ini memungkinkan Anda menulis API di mana kedua belah pihak 'penelepon', dan tidak ada yang 'callee'. Di lain, lingkungan yang lebih statis Anda tidak memiliki fasilitas ini, jadi Anda perlu peretasan ini untuk memasukkan petunjuk ke aliran kontrol.
sumber