Perbedaan antara Dependency Injection (DI) dan Inversion of Control (IOC)

117

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.

agas
sumber
Inversi Kontrol biasanya merujuk pada "wadah" sedangkan Injeksi Ketergantungan mengacu pada pola aktual. Tapi mereka berjalan beriringan. Saya akan merekomendasikan membaca artikel Martin Fowler untuk memahami topik ini.
Ben Hoffstein
Ketergantungan Injeksi adalah hal yang Anda lakukan, yang mengarah ke struktur perintah yang disebut Inversion of Control. Mereka terkait secara inheren.
2
DI adalah bentuk IoC, saya memberikan penjelasan yang cukup rinci tentang DI dan IoC dalam jawaban ini
2
Saya akan mengatakan bahwa DI adalah kasus khusus IOC. Kontrol tradisional pergi modul-> modul permintaan dari manajer modul, di DI itu terbalik ke manajer modul-> dapatkan dependensi yang diminta dari modul.
Rafał Dowgird
Jadi dengan kata lain, pada dasarnya IoC adalah implementasi dari menggunakan DI. Apakah saya mendapatkannya dengan benar?
dance2die

Jawaban:

53

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.

Membuang
sumber
3
Tidak, IoC adalah konsep yang lebih lama dan tidak tergantung pada DI (yang tidak bergantung pada IoC). Misalnya, ambil kerangka kerja Struts (Java): sangat bergantung pada IoC, tetapi tidak menggunakan DI.
Rogério
1
@ Rogério - Anda menegaskan bahwa kedua konsep tidak saling membutuhkan. Saya memperbarui jawaban saya untuk mengklarifikasi itu dan kemudian dengan cepat menggambarkan bagaimana beberapa kerangka kerja menggunakannya bersama-sama untuk memungkinkan kode yang lebih longgar digabungkan.
Chuck
Aplikasi paling sederhana dari IoC, mungkin adalah ActionListener. Alih-alih secara prosedural menangani kode, kode penanganan acara didelegasikan ke kode kustom. Dengan ini membalikkan kontrol.
mikrofon
0

Artikel bagus untuk memahami IOC dan DI http://martinfowler.com/articles/injection.html

IOC (Pembalikan Kontrol)

IOC artinya

  1. pengkodean ke antarmuka (satu komponen harus bergantung pada antarmuka komponen lain dan bukan pada impl), dan mis

    interface iComp_2 {...}
    
    class Comp_1 {
        iComp_2 c2 = ….;
    }
    
  2. menghapus kode spesifik implementasi komponen misalnya

    Comp_1 {
        iComp_2 c2 = getComp_2_Impl(); // not new Comp_2_Impl();
    }
    

IOC dapat dicapai dengan salah satu dari berikut ini:

1. DI (Injeksi Ketergantungan)

3 types of DI

1.1 Constructor Injection

1.2 Setter Injection

1.3 Interface Injection

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.

Yatendra Goel
sumber
6
Apakah Anda benar-benar membaca artikel "suntikan"? IOC tidak berarti apa yang dikatakan jawaban ini, tidak sama sekali.
Rogério
-3

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".

mB.
sumber
-4

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.

Javier
sumber