Saya telah refactoring sistem yang ada untuk menggunakan injeksi ketergantungan, dan pekerjaan itu telah berjalan dengan lancar.
Setelah beberapa saat saya perhatikan bahwa sejumlah besar perpustakaan in-house menjadi tergantung pada kerangka DI yang saya gunakan. Akibatnya seluruh proyek sekarang tergantung pada kerangka kerja pihak ketiga ini.
Saya melihat sebuah ironi dalam memisahkan semua dependensi dengan membuatnya tergantung pada perpustakaan bersama.
Reaksi pertama saya adalah membuat perpustakaan pembungkus di sekitar kerangka kerja dependensi. Oleh karena itu, saya bisa mengganti kerangka kerja ini jika diperlukan. Setelah memperkirakan pekerjaan yang terlibat, saya menyadari bahwa API yang dihasilkan akan mirip dengan kerangka kerja yang ada, dan karenanya membuatnya lebih sulit untuk menggantinya. Jadi saya meninggalkan ide itu.
Kekhawatiran saya adalah bahwa kerangka kerja DI yang saya gunakan menjadi usang atau perlu diganti.
Apakah ada pola pengembangan saat bekerja dengan DI yang mengurangi sambungan antara proyek dan kerangka kerja DI?
sumber
DIFramework.Get<IService>()
sebenarnya bukan injeksi ketergantungan; itu adalah pola terkait yang disebut Pencari Layanan. Banyak orang yang tidak menyukai Service Locator karena ia menyatukan Anda dengan framework dan karena terlalu mudah disalahgunakan (seperti Singleton). Martin Fowler memiliki artikel hebat tentang pola-pola ini: martinfowler.com/articles/injection.htmlJawaban:
Anda sepenuhnya benar - menggunakan kerangka DI kemungkinan besar akan membuat kode Anda tergantung dari hal itu. Sebenarnya, itu terlalu mengejutkan, karena ini biasanya berlaku untuk setiap kerangka kerja atau pustaka dasar lainnya, terutama ketika lib mendukung proyek Anda dengan beberapa fitur umum yang digunakan di mana pun dalam kode Anda. Misalnya, ketika Anda memutuskan untuk menggunakan kerangka UI atau kerangka kerja Web tertentu, keputusan ini sulit diubah setelah Anda membangun sejumlah kode berdasarkan pustaka tersebut. Ketika Anda memutuskan untuk menggunakan kelas tertentu (mungkin non-standar)
String
, Anda tidak dapat dengan mudah mengubah keputusan itu nanti. Keputusan seperti itu adalah keputusan arsitektural, seperti memilih bahasa pemrograman tertentu dan mencoba mengubah keputusan itu setelah Anda menulis> 100 ribu baris kode.Memiliki semua kode Anda bergantung pada kerangka kerja tertentu mungkin tidak menjadi masalah selama ia melakukan apa yang Anda harapkan darinya, dan selama itu dikelola dengan baik. Tapi itu bisa menjadi masalah jika bukan itu masalahnya. Ada beberapa strategi bagaimana menghadapi situasi itu:
pilih kerangka kerja dari vendor yang Anda yakini dapat memberikan Anda pembaruan dan rilis baru untuk beberapa tahun dari sekarang
pilih kerangka kerja open source yang memiliki sedikit garis kode (dan lisensi yang tepat), sehingga Anda dapat melakukan pemeliharaan sendiri, mengingat vendor menghilang dari pasar
tulis kerangka kerja Anda sendiri
hidup dengan situasi selama vendor tersedia, dan ketika dia benar-benar menghilang, pilih kerangka kerja yang berbeda dan cobalah untuk membuat adaptor yang mengemulasi kerangka lama menggunakan yang baru
Ide membuat perpustakaan pembungkus sebelumnya bukanlah hal yang baru sama sekali, tetapi saya jarang melihat itu berfungsi, karena Anda harus membuat asumsi untuk situasi di masa depan yang Anda tidak tahu apakah atau kapan itu akan memukul Anda, dan apa kerangka "baru" akan terlihat seperti. Di sisi lain, beberapa tahun yang lalu kami berhasil bertukar kerangka kerja UI lengkap dalam proyek C ++ dengan ~ 120K baris kode dengan menerapkan strategi adaptor yang saya sebutkan di atas.
sumber
Injeksi konstruktor biasa tidak memerlukan kerangka sama sekali. Satu-satunya hal yang Anda kehilangan adalah kemampuan untuk memusatkan dependensi Anda dalam file konfigurasi.
Wadah DI adalah pola "perangkat lunak perusahaan", digunakan ketika grafik objek sangat besar dan kompleks. Saya menduga 95% aplikasi tidak memerlukannya.
sumber
Saya tidak berpikir kerangka kerja DI benar-benar dapat menjadi usang dalam waktu dekat. Apa yang harus terjadi untuk membuatnya usang?
Saya akan mengatakan bahwa DI saat ini sudah cukup matang dan saya tidak menyadari banyak yang terjadi di sana. Anda belum menentukan bahasa Anda, jadi berbicara tentang Guice , ini cukup tidak mengganggu dan berfungsi dengan anotasi Java standar (juga menggunakan sendiri untuk hal-hal yang tidak terstandarisasi, tetapi Anda jarang membutuhkannya). Ini bersumber terbuka, banyak digunakan, dan berlisensi Apache. Apa yang bisa menjadi masalah?
Saya cukup yakin bahwa mengubah kerangka kerja DI akan menjadi urutan besarnya lebih mudah daripada mengubah perpustakaan lain (misalnya, perubahan UI berarti lebih banyak pekerjaan).
sumber