Saya telah melihat beberapa merekomendasikan penggunaan wadah IoC dalam kode. Motivasinya sederhana. Ambil kode injeksi ketergantungan berikut:
class UnitUnderTest
{
std::auto_ptr<Dependency> d_;
public:
UnitUnderTest(
std::auto_ptr<Dependency> d = std::auto_ptr<Dependency>(new ConcreteDependency)
) : d_(d)
{
}
};
TEST(UnitUnderTest, Example)
{
std::auto_ptr<Dependency> dep(new MockDependency);
UnitUnderTest uut(dep);
//Test here
}
Ke:
class UnitUnderTest
{
std::auto_ptr<Dependency> d_;
public:
UnitUnderTest()
{
d_.reset(static_cast<Dependency *>(IocContainer::Get("Dependency")));
}
};
TEST(UnitUnderTest, Example)
{
UnitUnderTest uut;
//Test here
}
//Config for IOC container normally
<Dependency>ConcreteDependency</Dependency>
//Config for IOC container for testing
<Dependency>MockDependency</Dependency>
(Di atas adalah contoh C ++ hipotetis tentu saja)
Sementara saya setuju bahwa ini menyederhanakan antarmuka kelas dengan menghapus parameter konstruktor dependensi, saya pikir penyembuhannya lebih buruk daripada penyakit karena beberapa alasan. Pertama, dan ini yang besar bagi saya, ini membuat program Anda tergantung pada file konfigurasi eksternal. Jika Anda membutuhkan penyebaran biner tunggal, Anda tidak bisa menggunakan wadah seperti ini. Masalah kedua adalah bahwa API sekarang lemah dan lebih buruk, diketik dengan ketat . Buktinya (dalam contoh hipotetis ini) adalah argumen string ke wadah IoC, dan para pemeran pada hasilnya.
Jadi .. adakah manfaat lain dari menggunakan wadah semacam ini atau apakah saya hanya tidak setuju dengan mereka yang merekomendasikan wadah tersebut?
sumber
Jawaban:
Dalam aplikasi besar dengan banyak lapisan dan banyak bagian yang bergerak, kelemahannya mulai terlihat sangat kecil jika dibandingkan dengan kelebihannya.
Wadah memang "menyederhanakan antarmuka" kelas, tetapi melakukannya dengan cara yang sangat penting. Wadah adalah solusi untuk masalah yang diciptakan injeksi ketergantungan, yang merupakan kebutuhan untuk meneruskan ketergantungan di semua tempat, turun melalui grafik objek dan melintasi area fungsional. Anda memiliki satu contoh kecil di sini yang memiliki satu ketergantungan - bagaimana jika objek ini memiliki tiga dependensi, dan objek yang bergantung padanya memiliki beberapa objek yang bergantung padanya , dan seterusnya? Tanpa wadah, objek di atas rantai ketergantungan tersebut akhirnya menjadi bertanggung jawab untuk melacak semua dependensi di seluruh aplikasi.
Ada berbagai jenis wadah juga. Tidak semuanya diketik secara ketat, dan tidak semuanya memerlukan file konfigurasi.
sumber
Kerangka kerja Guice IoC dari Java tidak bergantung pada file konfigurasi tetapi pada kode konfigurasi . Ini berarti bahwa konfigurasi adalah kode yang tidak berbeda dari kode yang membuat aplikasi Anda yang sebenarnya, dan dapat di refactored dll.
Saya percaya bahwa Guice adalah kerangka Java IoC yang akhirnya mendapatkan konfigurasi yang benar.
sumber
Jawaban SO yang luar biasa dari Ben Scheirman ini merinci beberapa contoh kode dalam C #; beberapa keuntungan dari wadah IOC (DI) adalah:
sumber