क्या सीरियलाइज़ेशन डिपेंडेंसी इंजेक्शन के उपयोग को रोकता है?


9

सरल प्रश्न: मैं समझता हूं कि सी # में सीरियलिफ़िकेशन के लिए डिफ़ॉल्ट निर्माणकर्ताओं की आवश्यकता होती है। यह कंस्ट्रक्टर इंजेक्टेड डीआई (जो आमतौर पर डीआई की पसंदीदा शैली है, मेरे पढ़ने में [उद्धरण वांछित] ) का उपयोग करने की संभावना को समाप्त कर देगा । तो क्या यह वास्तव में या तो स्थिति है या मैं कुछ याद कर रहा हूं?

(साइड क्वेश्चन): क्या आईओसी कंटेनर इस ट्रेडऑफ को किसी तरह आगे बढ़ाते हैं?


This would eliminate the possibility of using Constructor injected DI-- क्यों? आपके पास अभी भी पैरामीटराइज्ड इंस्ट्रक्टर हो सकते हैं, इसलिए जब तक आप क्रमांकन प्रयोजनों के लिए एक डिफ़ॉल्ट कंस्ट्रक्टर शामिल करते हैं (यदि आप चाहें तो डिफॉल्ट कंस्ट्रक्टर निजी हो सकता है)।
रॉबर्ट हार्वे

@ रोबर्टहवे: मैं थोड़ा घना महसूस कर रहा हूं, लेकिन मैं आपको नहीं पाता। "पैरामीटरयुक्त प्रशिक्षक" क्या है? (टाइपो?) एक बार एक वस्तु को डी-सीरियल किए जाने के बाद, मैं इसे फिर से निर्माण नहीं कर सकता। क्या आप सुझाव दे रहे हैं कि मैं एक डिफ़ॉल्ट-संरक्षित वस्तु पर संपत्ति / सेटर इंजेक्शन का उपयोग करूं?
kmote

1
एक पैरामीटर निर्मित निर्माता पैरामीटर के साथ एक है। मैं यहाँ यह मान रहा हूँ कि deserialization डेटा से उत्पन्न होता है जो एक ऐसी वस्तु से प्राप्त होता है जिसे निर्भरता इंजेक्शन का उपयोग करके ठीक से बनाया गया था। आपको वशीकरण के दौरान वस्तु का निर्माण नहीं करना है; यह पहले से ही निर्माण किया गया था।
रॉबर्ट हार्वे

1
नहीं, तुम गलत नहीं हो। यह वैसे काम करता है। इसे बैक-डोर इंजेक्शन समझें। आपको कोई सत्यापन नहीं मिलेगा, लेकिन यह काम करेगा। ध्यान दें कि बाइनरीफ़ॉर्मर और डेटाकंट्रेक्टसलाइज़र को डिफ़ॉल्ट निर्माणकर्ताओं की आवश्यकता नहीं है।
रॉबर्ट हार्वे

1
स्पष्ट होने के लिए, सभी डिसेरिएलाइज़ेशन करता है जो आपके ऑब्जेक्ट में एक्सएमएल ऑब्जेक्ट में निर्दिष्ट मानों के साथ स्थिति को भरता है। इसे पूरा करने के लिए यह परावर्तन का उपयोग करता है, और किसी भी प्रकार के निर्माता सत्यापन तर्क को दरकिनार कर देता है, इसलिए DI के दृष्टिकोण से, यह धोखा है, जब तक कि उन XML मान मूल रूप से साधारण DI के माध्यम से निर्मित वस्तु से नहीं आए।
रॉबर्ट हार्वे

जवाबों:


6

किसी ऑब्जेक्ट को डी-सीरियल करना संभव नहीं है और मानक क्रमांकन तंत्र का उपयोग करके, सी # में एक चरण में , पहले से मौजूद किसी अन्य पर निर्भरता को इंजेक्ट करें । आपको इसके स्थान पर प्रॉपर्टी इंजेक्शन का उपयोग करना होगा, पहले डिसेरिएलाइज़र का उपयोग करके ऑब्जेक्ट का निर्माण करना, बाद में निर्भरता को इंजेक्ट करना। अधिकांश वास्तविक दुनिया के अनुप्रयोगों के लिए, मैं इसे वास्तविक कमी नहीं मानता हूं - यदि आपके पास एक अनुक्रमिक डेटा मॉडल वर्ग है, जिसमें अन्य, गैर-डेटा मॉडल कक्षाओं के लिए भी निर्भरता है, तो आपको यह जांचना चाहिए कि क्या आपका डेटा मॉडल वर्ग हो सकता है बहुत सारी जिम्मेदारियां पहले से ही।

अगर यह वास्तव में आपको परेशान करता है, तो आप अपनी क्रमिक वस्तु को डेकोरेटर वर्ग के साथ लपेटने पर विचार कर सकते हैं, जहां आप कंस्ट्रक्टर के माध्यम से डी-सीरियलाइज़र और अतिरिक्त निर्भरताएं पास कर सकते हैं। इसके बाद रैपर अपने कंस्ट्रक्टर में दो चरणों (लिपटे हुए ऑब्जेक्ट और संपत्ति इंजेक्शन का डी-क्रमांकन) को निष्पादित करता है।


1

मैं इस समस्या को इस तरह हल कर रहा हूं: निर्भरता के कारखानों को इंजेक्ट करना। उन कारखानों में, पहले निर्भरता को हल करें क्योंकि यह कंटेनर में पंजीकृत है, फिर शेष सभी डेटा को "डिसेरलाइज़िंग": json.net मौजूदा ऑब्जेक्ट में फ़ील्ड्स को पॉप्युलेट करने की अनुमति देता है।

जैसा कि कारखानों का कोड IoC कंटेनर के वायरिंग कोड के साथ होता है, मुझे नहीं लगता कि container.Resolveकारखाने के अंदर का उपयोग नियम का उल्लंघन करता है, जिसका containerउपयोग कोड में सिर्फ एक जगह पर किया जाना है: जहां सभी वायरिंग होती है।

अब तक, मैं इस प्रक्रिया को स्वचालित बनाने की कोशिश कर रहा हूं (जैसा कि मैं उस दृष्टिकोण का परीक्षण कर रहा हूं, उसके विपरीत) प्रतिबिंब का उपयोग करके। हां, json.net deserialization से बहुत कुछ नहीं होता है, इसका एक हिस्सा कस्टम कोड के साथ प्रतिस्थापित किया जाता है, लेकिन मुझे लगता है, परेशान क्यों होते हैं।

साथ ही, इस मामले पर आपके अंतिम विचार / निर्णय क्या थे? इस पोस्ट को पढ़ने के बाद मैं दो तरीके देखता हूं: deserialize, फिर इंजेक्ट करें; या इंजेक्ट करें, फिर deserialize (populate) करें। और मुझे अभी भी अपना रास्ता बेहतर लग रहा है। इसके विरोध में दलीलें सुनकर खुशी होगी (मैं इस बारे में, कि मेरा रास्ता मेरे मामले के लिए बेहतर हो सकता है, लेकिन अच्छे वैकल्पिक मामलों की कल्पना नहीं कर सकता, जहां यह विफल हो जाता है, बस कुछ मामूली अनुमान हैं)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.