Sebenarnya, Injeksi Ketergantungan hanya benar-benar menentang BUKAN Injeksi Ketergantungan - dan karenanya strategi manajemen ketergantungan yang bukan Injeksi Ketergantungan.
Sambungan [tidak diinginkan], meskipun bukan masalah orthogonal, dapat terjadi atau dikurangi dengan cara apa pun. Keduanya digabungkan ke DependencyClass:
public DependencyInjectedConstructor(DependencyClass dep) {
dep.do();
}
public DependencyLookupConstructor() {
var dep = new DependencyClass();
dep.do();
}
DependencyLookupConstructordigabungkan ke tertentu DependencyClassdalam hal ini. Tapi, keduanya digabungkan DependencyClass. Kejahatan yang sebenarnya, jika ada satu di sini, bukan kopling, itu yang DependencyLookupConstructorperlu diubah jika DependencyClasstiba-tiba membutuhkan ketergantungannya sendiri disuntikkan 1 .
Namun, konstruktor / kelas ini bahkan lebih longgar digabungkan:
public DependencyLocatingConstructor() {
var dep = ServiceLocator.GetMyDoer();
dep.do();
}
Jika Anda bekerja di C #, yang di atas akan memungkinkan Anda ServiceLocatoruntuk mengembalikan apa pun saat GetMyDoer()dipanggil, asalkan itu dapat do()apa yang DependencyLocatingConstructormemilikinya do(). Anda mendapatkan manfaat dari validasi tandatangan waktu kompilasi bahkan tanpa digabungkan ke antarmuka 2 yang lengkap .
Jadi, pilih racunmu.
Tetapi pada dasarnya, jika ada "kebalikan" konkret dari Injeksi Ketergantungan, itu akan menjadi sesuatu yang lain di bidang "Strategi Manajemen Ketergantungan." Di antara yang lain, jika Anda menggunakan hal-hal berikut dalam percakapan, saya akan mengenalinya BUKAN Injeksi Ketergantungan:
- Pola Penunjuk Lokasi Layanan
- Ketergantungan Lokasi / Lokasi
- Objek langsung / konstruksi ketergantungan
- Ketergantungan tersembunyi
- "Bukan Injeksi Ketergantungan"
1. Ironisnya, beberapa masalah yang DI pecahkan pada level yang lebih tinggi adalah semacam akibat [over-] menggunakan DI pada level yang lebih rendah. Saya merasa senang bekerja dengan basis kode dengan kompleksitas yang tidak perlu di seluruh tempat sebagai hasil dari menampung beberapa tempat di mana kompleksitas itu sebenarnya membantu ... Saya diakui bias oleh paparan yang buruk.
2. Menggunakan lokasi layanan juga memungkinkan Anda untuk dengan mudah menentukan dependensi berbeda dari jenis yang sama dengan peran fungsionalnya dari kode yang digunakan , sementara sebagian besar masih agnostik tentang bagaimana dependensi dibangun. Misalkan Anda perlu menyelesaikan Useratau IUseruntuk tujuan yang berbeda: Misalnya, Locator.GetAdministrator()versus Locator.GetAuthor()- atau apa pun. Kode saya dapat menanyakan apa yang dibutuhkan secara fungsional tanpa mengetahui antarmuka apa yang didukungnya.