Di luar kerangka kerja dependensi-injeksi, injeksi dependensi (melalui injeksi konstruktor atau injeksi setter) hampir merupakan permainan zero-sum: Anda mengurangi sambungan antara objek A dan dependensi B itu, tetapi sekarang semua objek yang membutuhkan instance A sekarang harus juga membangun objek B.
Anda telah sedikit mengurangi kopling antara A dan B, tetapi mengurangi enkapsulasi A, dan meningkatkan kopling antara A dan setiap kelas yang harus membuat turunan A, dengan menyambungkannya ke dependensi A juga.
Jadi injeksi ketergantungan (tanpa kerangka kerja) adalah sama-sama berbahaya karena sangat membantu.
Biaya tambahan seringkali mudah dibenarkan, namun: jika kode klien lebih tahu tentang bagaimana membangun ketergantungan daripada objek itu sendiri, maka injeksi ketergantungan benar-benar mengurangi kopling; misalnya, Pemindai tidak tahu banyak tentang cara mendapatkan atau membangun aliran input untuk mem-parsing input, atau sumber dari mana kode klien ingin mem-parsing input, jadi injeksi konstruktor dari aliran input adalah solusi yang jelas.
Pengujian adalah pembenaran lain, agar dapat menggunakan dependensi tiruan. Itu harus berarti menambahkan konstruktor tambahan yang digunakan hanya untuk pengujian yang memungkinkan dependensi disuntikkan: jika Anda mengganti konstruktor Anda untuk selalu memerlukan dependensi yang akan disuntikkan, tiba-tiba, Anda harus tahu tentang dependensi dependensi Anda untuk membangun Anda ketergantungan langsung, dan Anda tidak dapat menyelesaikan pekerjaan.
Ini bisa membantu, tetapi Anda harus bertanya pada diri sendiri untuk setiap ketergantungan, apakah manfaat pengujian sebanding dengan biayanya, dan apakah saya benar-benar ingin mengejek ketergantungan ini saat pengujian?
Ketika kerangka kerja dependensi-injeksi ditambahkan, dan konstruksi dependensi didelegasikan bukan ke kode klien tetapi sebaliknya ke kerangka kerja, analisis biaya / manfaat sangat berubah.
Dalam kerangka kerja ketergantungan-injeksi, pengorbanannya sedikit berbeda; apa yang Anda kehilangan dengan menyuntikkan dependensi adalah kemampuan untuk mengetahui dengan mudah implementasi apa yang Anda andalkan, dan mengalihkan tanggung jawab untuk memutuskan dependensi apa yang Anda andalkan untuk beberapa proses resolusi otomatis (misalnya jika kami memerlukan @ Inject'ed Foo , harus ada sesuatu yang menyediakan @Foo, dan yang dependensinya disuntikkan tersedia), atau ke beberapa file konfigurasi tingkat tinggi yang menentukan penyedia apa yang harus digunakan untuk setiap sumber daya, atau untuk beberapa hibrida dari keduanya (misalnya, mungkin ada menjadi proses resolusi otomatis untuk dependensi yang dapat diganti, jika perlu, menggunakan file konfigurasi).
Seperti dalam injeksi konstruktor, saya pikir keuntungan dari melakukannya berakhir, sekali lagi, sangat mirip dengan biaya melakukannya: Anda tidak perlu tahu siapa yang menyediakan data yang Anda andalkan, dan, jika ada banyak potensi penyedia, Anda tidak perlu tahu urutan pilihan untuk memeriksa penyedia di, pastikan bahwa setiap lokasi yang membutuhkan data memeriksa semua penyedia potensial, dll., karena semua itu ditangani pada tingkat tinggi oleh injeksi ketergantungan peron.
Meskipun saya secara pribadi tidak memiliki banyak pengalaman dengan kerangka kerja DI, kesan saya adalah mereka memberikan lebih banyak manfaat daripada biaya ketika sakit kepala menemukan penyedia data atau layanan yang Anda butuhkan memiliki biaya lebih tinggi daripada sakit kepala, ketika sesuatu gagal, tidak segera mengetahui secara lokal kode apa yang menyediakan data buruk yang kemudian menyebabkan kegagalan pada kode Anda.
Dalam beberapa kasus, pola-pola lain yang mengaburkan ketergantungan (misalnya pencari layanan) telah diadopsi (dan mungkin juga terbukti nilainya) ketika kerangka kerja DI muncul di tempat kejadian, dan kerangka kerja DI diadopsi karena mereka menawarkan beberapa keunggulan kompetitif, seperti membutuhkan kode kurang boilerplate, atau berpotensi melakukan lebih sedikit untuk mengaburkan penyedia ketergantungan ketika menjadi perlu untuk menentukan penyedia apa yang sebenarnya digunakan.