मैं लंबे सवाल के लिए माफी माँगता हूँ, यह एक शेख़ी के रूप में थोड़ा पढ़ता है, लेकिन मैं वादा करता हूँ कि यह नहीं है! मैंने अपना प्रश्न नीचे प्रस्तुत किया है
एमवीसी दुनिया में, चीजें सीधी होती हैं। मॉडल में राज्य है, दृश्य मॉडल दिखाता है, और नियंत्रक मॉडल (मूल रूप से) के साथ सामान करता है , एक नियंत्रक की कोई स्थिति नहीं है। करने के लिए कर सामान नियंत्रक वेब सेवाओं, भंडार, बहुत पर कुछ निर्भरता है। जब आप किसी कंट्रोलर को इंस्टेंट करते हैं तो आप उन निर्भरताओं की आपूर्ति के बारे में परवाह करते हैं, और कुछ नहीं। जब आप किसी क्रिया (नियंत्रक पर विधि) को निष्पादित करते हैं, तो आप उन निर्भरता का उपयोग करके मॉडल को पुनः प्राप्त करने या अपडेट करने या किसी अन्य डोमेन सेवा को कॉल करने के लिए उपयोग करते हैं। यदि कोई संदर्भ है, तो कहें कि कुछ उपयोगकर्ता किसी विशेष आइटम का विवरण देखना चाहते हैं, आप कार्रवाई के पैरामीटर के रूप में उस आइटम की आईडी पास करते हैं। नियंत्रक में कहीं भी किसी भी राज्य के लिए कोई संदर्भ नहीं है। अब तक सब ठीक है।
MVVM दर्ज करें। मुझे WPF पसंद है, मुझे डेटा बाइंडिंग बहुत पसंद है। मुझे ऐसे फ्रेमवर्क पसंद हैं जो ViewModels के लिए डेटा बाइंडिंग को और भी आसान बनाते हैं (Caliburn Micro atm का उपयोग करके)। मुझे लगता है कि इस दुनिया में चीजें कम सीधी हैं। चलो व्यायाम फिर से: मॉडल राज्य, देखें है शो ViewModel, और ViewModel करता मॉडल (मूल रूप से) के साथ / करने के लिए सामान, एक ViewModel करता राज्य है! (स्पष्ट करने के लिए, शायद यह एक या अधिक मॉडल के प्रतिनिधियों सभी गुण हैं, लेकिन वह साधन यह मॉडल एक तरह से या किसी अन्य, जो अपने आप में राज्य है के लिए एक संदर्भ होना आवश्यक है) करने के लिए करते हैंViewModel में वेब सेवाओं, भंडार, बहुत कुछ पर निर्भरताएं हैं। जब आप एक ViewModel को इंस्टेंट करते हैं, तो आप उन निर्भरताओं की आपूर्ति के बारे में परवाह करते हैं, लेकिन राज्य भी। और यह, देवियों और सज्जनों, मुझे कोई अंत नहीं है।
जब भी आपको इसमें ProductDetailsViewModel
से ProductSearchViewModel
(जिसमें से आपने कॉल किया था, ProductSearchWebService
जिसे IEnumerable<ProductDTO>
हर कोई अभी भी मेरे पास है?) से इन्स्टैंट करने की जरूरत है , तो आप इनमें से एक काम कर सकते हैं:
- कॉल
new ProductDetailsViewModel(productDTO, _shoppingCartWebService /* dependcy */);
, यह बुरा है, 3 अधिक निर्भरता की कल्पना करें , इसका मतलबProductSearchViewModel
उन निर्भरताओं को भी लेने की आवश्यकता है। इसके अलावा कंस्ट्रक्टर को बदलना दर्दनाक है। - कॉल
_myInjectedProductDetailsViewModelFactory.Create().Initialize(productDTO);
, कारखाने सिर्फ एक फंक है, वे आसानी से अधिकांश आईओसी ढांचे द्वारा उत्पन्न होते हैं। मुझे लगता है कि यह बुरा है क्योंकि Init विधियां एक टपका हुआ अमूर्त है। आप उन क्षेत्रों के लिए भी आसानी से कीवर्ड का उपयोग नहीं कर सकते हैं जो इनिट विधि में सेट किए गए हैं। मुझे यकीन है कि कुछ और कारण हैं। _myInjectedProductDetailsViewModelAbstractFactory.Create(productDTO);
तो कॉल करें ... यह पैटर्न (अमूर्त कारखाना) है जिसे आमतौर पर इस प्रकार की समस्या के लिए अनुशंसित किया जाता है। यद्यपि यह वास्तव में इसका उपयोग करने की मेरी लालसा को संतुष्ट करता है, जब तक कि मैं वास्तव में इसका उपयोग करना शुरू नहीं करता, यह प्रतिभा थी। बॉयलरप्लेट कोड की मात्रा मुझे लगता है कि बहुत अधिक है (आप जानते हैं कि हास्यास्पद चर नामों के अलावा मुझे उपयोग मिलता है)। प्रत्येक ViewModel के लिए जो रनटाइम मापदंडों की आवश्यकता होती है, आपको दो अतिरिक्त फ़ाइलें (फ़ैक्टरी इंटरफ़ेस और कार्यान्वयन) मिलेंगी, और आपको 4 अतिरिक्त समय की तरह नॉन-रनटाइम निर्भरताएँ टाइप करनी होंगी। और हर बार जब निर्भरता बदलती है, तो आपको इसे कारखाने में भी बदलना होगा। ऐसा महसूस होता है कि मैं अब DI कंटेनर का उपयोग नहीं करता। (मुझे लगता है कि कैसल विंडसर के पास इसके लिए कुछ प्रकार का समाधान है [इसके साथ अपनी कमियां हैं, मुझे सही करें अगर मैं गलत हूं])।- अनाम प्रकार या शब्दकोश के साथ कुछ करें। मुझे अपनी स्टैटिक टाइपिंग पसंद है।
तो हाँ। इस तरह से राज्य और व्यवहार को मिलाने से एक समस्या पैदा होती है जो MVC में बिल्कुल भी मौजूद नहीं है। और मुझे लगता है कि वर्तमान में इस समस्या के लिए वास्तव में पर्याप्त समाधान नहीं है। अब मैं कुछ चीजों का पालन करना चाहता हूं:
- लोग वास्तव में MVVM का उपयोग करते हैं। इसलिए वे या तो उपरोक्त सभी के बारे में परवाह नहीं करते हैं, या उनके पास कुछ शानदार अन्य समाधान हैं।
- मुझे WPF के साथ MVVM का गहन उदाहरण नहीं मिला है। उदाहरण के लिए, NDDD- नमूना परियोजना ने मुझे कुछ DDD अवधारणाओं को समझने में बहुत मदद की। मैं वास्तव में इसे पसंद करूंगा अगर कोई मुझे MVVM / WPF के लिए कुछ समान दिशा में इंगित कर सके।
- शायद मैं MVVM को गलत कर रहा हूं और मुझे अपने डिजाइन को उल्टा करना चाहिए। शायद मुझे यह समस्या बिल्कुल नहीं होनी चाहिए। वैसे मुझे पता है कि अन्य लोगों ने भी यही सवाल पूछा है, इसलिए मुझे लगता है कि मैं अकेला नहीं हूं।
संक्षेप में
- क्या मैं यह निष्कर्ष निकालने के लिए सही हूं कि ViewModel का राज्य और व्यवहार दोनों के लिए एक एकीकरण बिंदु है और एक पूरे के रूप में MVVM पैटर्न के साथ कुछ कठिनाइयों का कारण है?
- अमूर्त कारखाने पैटर्न का उपयोग केवल / सर्वोत्तम तरीके से एक ViewModel को सांख्यिकीय रूप से टाइप करने के लिए किया गया है?
- क्या गहन संदर्भ कार्यान्वयन में ऐसा कुछ उपलब्ध है?
- दोनों राज्य / व्यवहार के साथ एक डिजाइन गंध के साथ बहुत सारे ViewModels रहा है?