Katakanlah kita memiliki 1001 klien yang membangun dependensi mereka secara langsung daripada menerima suntikan. Refactoring the 1001 bukanlah pilihan menurut bos kami. Kami sebenarnya bahkan tidak diizinkan mengakses sumbernya, hanya file kelas.
Apa yang seharusnya kita lakukan adalah "memodernisasi" sistem yang dilalui oleh 1001 klien ini. Kita dapat memperbaiki itu sesuka kita. Ketergantungan adalah bagian dari sistem itu. Dan beberapa dependensi yang seharusnya kita ubah untuk memiliki implementasi baru.
Apa yang ingin kami lakukan adalah memiliki kemampuan untuk mengkonfigurasi implementasi dependensi yang berbeda untuk memuaskan banyak klien ini. Sayangnya, DI tampaknya bukan pilihan karena klien tidak menerima suntikan dengan konstruktor atau setter.
Opsi:
1) Refactor implementasi layanan yang digunakan klien sehingga ia melakukan apa yang dibutuhkan klien sekarang. Bang kita sudah selesai. Tidak fleksibel. Tidak rumit.
2) Refactor implementasi sehingga mendelegasikan pekerjaannya ke ketergantungan lain yang diperoleh melalui pabrik. Sekarang kita dapat mengontrol implementasi mana yang mereka gunakan dengan refactoring pabrik.
3) Refactor implementasi sehingga mendelegasikan pekerjaannya ke ketergantungan lain yang diperolehnya melalui pencari layanan. Sekarang kita dapat mengontrol implementasi mana yang mereka semua gunakan dengan mengkonfigurasi locator layanan yang mungkin hanya berupa hashmap
string ke objek dengan sedikit casting yang terjadi.
4) Sesuatu yang bahkan belum kupikirkan.
Objektif:
Minimalkan kerusakan desain yang disebabkan oleh menyeret kode klien yang dirancang dengan buruk ke masa depan tanpa menambah kompleksitas yang tidak ada gunanya.
Klien seharusnya tidak mengetahui atau mengendalikan implementasi dependensi mereka tetapi mereka bersikeras untuk membangunnya bersama new
. Kami tidak bisa mengendalikan, new
tetapi kami mengontrol kelas yang mereka bangun.
Pertanyaan saya:
Apa yang gagal saya pertimbangkan?
apakah Anda benar-benar membutuhkan kemungkinan untuk mengkonfigurasi antar implementasi yang berbeda? Untuk tujuan apa?
Kelincahan. Banyak yang tidak diketahui. Manajemen menginginkan potensi perubahan. Kehilangan ketergantungan hanya pada dunia luar. Juga menguji.
apakah Anda memerlukan mekanik waktu berjalan, atau hanya kompilasi waktu mekanik untuk beralih di antara implementasi yang berbeda? Mengapa?
Mekanika waktu kompilasi kemungkinan cukup. Kecuali untuk pengujian.
granularity mana yang Anda perlukan untuk beralih antar implementasi? Semua sekaligus? Per modul (masing-masing berisi sekelompok kelas)? Per kelas?
Dari 1001 hanya satu yang dijalankan melalui sistem pada satu waktu. Mengubah apa yang digunakan semua klien sekaligus kemungkinan besar tidak masalah. Kontrol individu terhadap ketergantungan sepertinya penting.
siapa yang perlu mengendalikan sakelar? Hanya tim pengembang Anda? Administrator? Setiap klien sendiri? Atau pengembang pemeliharaan untuk kode klien? Jadi seberapa mudah / kuat / tidak mudah mekanik perlu?
Dev untuk pengujian. Administrator sebagai perubahan dependensi perangkat keras eksternal. Perlu mudah untuk menguji dan mengonfigurasi.
Tujuan kami adalah untuk menunjukkan bahwa sistem dapat dibuat kembali dengan cepat dan dimodernisasi.
kasus penggunaan aktual untuk sakelar implementasi?
Salah satunya adalah, beberapa data akan disediakan oleh perangkat lunak sampai solusi perangkat keras siap.