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?