Serileştirme, Bağımlılık Enjeksiyonu kullanımını engelliyor mu?


9

Basit soru: C # 'daki seri hale getirmenin varsayılan kurucular gerektirdiğini anlıyorum. Bu, Yapıcı enjekte edilmiş DI (genellikle DI'nin tercih edilen stili olan) okumamda [alıntı gerekli] kullanma olasılığını ortadan kaldıracaktır . Bu gerçekten bir ya da durum mu yoksa bir şey mi kaçırıyorum?

(Yan soru): IoC konteynırları bu dengesizliği bir şekilde mi etkiliyor?


This would eliminate the possibility of using Constructor injected DI-- Neden? Serileştirme amacıyla varsayılan bir kurucu eklediğiniz sürece parametreli eğitmenleriniz olabilir (isterseniz varsayılan kurucu özel olabilir).
Robert Harvey

@RobertHarvey: Kendimi biraz yoğun hissediyorum, ama seni tam anlamıyorum. "Parametreli eğitmen" nedir? (yazım hatası?) Bir nesnenin serileştirmesi kaldırıldıktan sonra, yeniden yapılandıramıyorum. Varsayılan olarak yapılandırılmış bir nesnede özellik / ayarlayıcı enjeksiyonunu kullanmamı önerir misiniz?
kmote

1
Parametreli bir kurucu, parametreleri olan bir kurucudur. Burada, serileştirmenin, bağımlılık enjeksiyonu kullanılarak düzgün bir şekilde oluşturulmuş bir nesneden türetilen verilerden oluştuğunu varsayıyorum. Deserialization sırasında nesneyi inşa etmek zorunda değilsiniz; daha önce inşa edilmişti.
Robert Harvey

1
Hayır, yanılmıyorsun. İşte böyle çalışır. Bunu arka kapı enjeksiyonu olarak düşünün. Herhangi bir doğrulama almayacaksınız, ancak işe yarayacak. BinaryFormatter ve DataContractSerializer'ın varsayılan kurucular gerektirmediğini unutmayın.
Robert Harvey

1
Açık olmak gerekirse, tüm serileştirme işlemi nesnenizdeki durumu XML nesnesinde belirtilen değerlerle doldurmaktır. Bunu gerçekleştirmek için Yansıma kullanır ve herhangi bir kurucu doğrulama mantığı biçimini atlar, bu nedenle DI perspektifinden bakıldığında, bu XML değerleri orijinal olarak sıradan DI ile oluşturulan bir nesneden gelmedikçe hile yapar.
Robert Harvey

Yanıtlar:


6

Standart serileştirme mekanizmaları kullanılarak bir nesnenin serileştirilmesi ve ayrıca C # 'da bir adımda mevcut olan başka bir nesneye bağımlılık enjekte edilmesi mümkün değildir . Bunun yerine özellik enjeksiyonunu kullanmanız, önce nesneyi serileştiriciyi kullanarak inşa etmeniz ve daha sonra bağımlılığı enjekte etmeniz gerekir. Çoğu gerçek dünyadaki uygulamalar için, bu arıcılığın gerçek bir dezavantaj olduğunu düşünmüyorum - diğer, veri dışı model sınıflarına da bağımlı olan serileştirilebilir bir veri modeli sınıfınız varsa, veri modeli sınıfınızın zaten çok fazla sorumluluk.

Bu gerçekten sizi rahatsız ediyorsa, serileştirilebilir nesneyi, serileştiriciyi ve ek bağımlılıkları yapıcıdan geçirebileceğiniz bir dekoratör sınıfıyla sarmayı düşünebilirsiniz. Bu sarıcı daha sonra yapıcısında iki adımı (sarılmış nesnenin serileştirilmesi ve özellik enjeksiyonunun) yürütür.


1

Bu sorunu şu şekilde çözüyorum: bağımlılık fabrikaları enjekte etmek. Bu fabrikalarda, bağımlılığı önce kapsayıcıda kayıtlı olduğu gibi çözer, sonra kalan tüm verileri "serileştirir": json.net varolan nesnede alanları doldurmaya izin verir.

Fabrikalar kodu IoC konteynerinin kablolama kodu ile birlikte giderken, container.Resolvefabrika içinde kullanmanın container, kodda sadece bir yerde kullanılması gereken kuralı ihlal ettiğini düşünmüyorum : tüm kablolama nerede.

Şu an itibariyle, yansımayı kullanarak bu süreci otomatik olarak (bu yaklaşımı test ettiğim şeyin aksine) yapmaya çalışıyorum. Evet, json.net deserialization kendisi ne fazla bir şey yok, bir kısmı özel kod ile değiştirilir, ama bence, neden rahatsız.

Ayrıca, konuyla ilgili son düşünceleriniz / kararınız neydi? Bu yazıyı okuduktan sonra iki yol görüyorum: seriyi kaldırın, sonra enjekte edin; veya enjekte edin, ardından serisini kaldırın (doldurun). Ve hala yolumu daha iyi buluyorum. Buna karşı olan argümanları duymaktan memnuniyet duyacağım (yolumun durumum için daha iyi olabileceğine dair, ancak başarısız olduğu iyi alternatif vakaları canlı olarak hayal edemiyorum, sadece bazı küçük tahminler)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.