Pertanyaan sederhana: Saya mengerti bahwa serialisasi dalam C # memerlukan konstruktor default. Ini akan menghilangkan kemungkinan menggunakan Constructor injected DI (yang umumnya merupakan gaya yang disukai DI, dalam bacaan saya [rujukan?] ). Jadi, apakah ini benar-benar sebuah situasi, atau apakah saya kehilangan sesuatu?
(Pertanyaan sampingan): Apakah kontainer IoC memihak tradeoff ini?
This would eliminate the possibility of using Constructor injected DI
- Kenapa? Anda masih dapat memiliki instruktur berparameter, selama Anda menyertakan konstruktor default untuk keperluan serialisasi (konstruktor default dapat bersifat pribadi, jika Anda mau).Jawaban:
Tidak mungkin untuk menderialisasi serial objek dan juga menyuntikkan dependensi ke objek lain yang sudah ada, dalam satu langkah dalam C #, menggunakan mekanisme serialisasi standar. Anda harus menggunakan injeksi properti, pertama membangun objek menggunakan deserializer, kemudian menyuntikkan ketergantungan. Untuk sebagian besar aplikasi dunia nyata, saya tidak menganggap ini sebagai kelemahan nyata - jika Anda memiliki kelas model data berseri, yang juga tergantung pada kelas model non-data lainnya, Anda harus memeriksa apakah kelas model data Anda mungkin memiliki sudah terlalu banyak tanggung jawab.
Jika itu benar-benar mengganggu Anda, Anda dapat mempertimbangkan untuk membungkus objek serializable Anda dengan kelas dekorator, di mana Anda dapat melewati de-serializer dan dependensi tambahan melalui konstruktor. Pembungkus itu kemudian mengeksekusi dua langkah (de-serialisasi objek terbungkus dan injeksi properti) dalam konstruktornya.
sumber
Saya memecahkan masalah ini seperti itu: menyuntikkan pabrik ketergantungan. Di pabrik-pabrik itu, pertama-tama selesaikan ketergantungan karena terdaftar dalam wadah, kemudian "deserialisasi" semua data yang tersisa: json.net memungkinkan untuk mengisi bidang dalam objek yang ada.
Karena kode pabrik sejalan dengan kode kabel wadah IoC, saya tidak berpikir menggunakan
container.Resolve
di dalam pabrik melanggar aturan, yangcontainer
harus digunakan hanya di satu tempat dalam kode: di mana semua kabel terjadi.Sampai sekarang, saya mencoba untuk membuat proses ini otomatis (sebagai lawan dari apa yang saya telah menguji pendekatan itu di) menggunakan refleksi. Ya, tidak banyak yang tersisa dari deserialisasi json.net itu sendiri, bagian dari itu diganti dengan kode kustom, tapi saya pikir, mengapa repot-repot.
Juga, apa pemikiran / keputusan akhir Anda tentang masalah ini? Setelah membaca posting ini saya melihat dua cara: deserialize, lalu suntikkan; atau menyuntikkan, lalu deserialize (mengisi). Dan saya masih menemukan cara saya lebih baik. Akan senang mendengar argumen yang bertentangan dengan ini (saya kira, bahwa cara saya mungkin lebih baik untuk kasus saya, tetapi tidak dapat dengan jelas membayangkan kasus alternatif yang baik, di mana gagal, hanya beberapa tebakan kecil)
sumber