Saya telah merenungkan bagaimana menyeimbangkan desain yang dapat diuji menggunakan injeksi ketergantungan dengan menyediakan API publik sederhana yang tetap. Dilema saya adalah: orang ingin melakukan sesuatu seperti var server = new Server(){ ... }
dan tidak perlu khawatir menciptakan banyak dependensi dan grafik dependensi yang Server(,,,,,,)
mungkin dimiliki. Saat berkembang, saya tidak terlalu khawatir, karena saya menggunakan kerangka kerja IoC / DI untuk menangani semua itu (saya tidak menggunakan aspek manajemen siklus hidup dari wadah apa pun, yang akan memperumit masalah lebih lanjut).
Sekarang, dependensi tidak mungkin diimplementasikan kembali. Komponen dalam hal ini hampir murni untuk testabilitas (dan desain yang layak!) Daripada membuat jahitan untuk ekstensi, dll. Orang akan 99,999% dari waktu ingin menggunakan konfigurasi default. Begitu. Saya bisa membuat hardcode dependensi. Tidak ingin melakukan itu, kami kehilangan pengujian kami! Saya bisa menyediakan konstruktor default dengan dependensi hard-coded dan yang membutuhkan dependensi. Itu ... berantakan, dan mungkin membingungkan, tetapi layak. Saya bisa membuat dependensi menerima konstruktor internal dan membuat unit saya menguji teman perakitan (dengan asumsi C #), yang merapikan API publik tetapi meninggalkan perangkap tersembunyi yang jahat mengintai untuk pemeliharaan. Memiliki dua konstruktor yang secara implisit terhubung daripada secara eksplisit akan menjadi desain yang buruk secara umum dalam buku saya.
Saat ini tentang kejahatan paling sedikit yang bisa saya pikirkan. Pendapat? Kebijaksanaan?