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();
}
DependencyLookupConstructor
digabungkan ke tertentu DependencyClass
dalam hal ini. Tapi, keduanya digabungkan DependencyClass
. Kejahatan yang sebenarnya, jika ada satu di sini, bukan kopling, itu yang DependencyLookupConstructor
perlu diubah jika DependencyClass
tiba-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 ServiceLocator
untuk mengembalikan apa pun saat GetMyDoer()
dipanggil, asalkan itu dapat do()
apa yang DependencyLocatingConstructor
memilikinya 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 User
atau IUser
untuk 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.