2012-10-10 14 views
7

मैंने एमवीवीएमसी पैटर्न के बारे में this आलेख पढ़ा है। अब मेरे पास एक सवाल है। क्या नियंत्रक को ViewModel में इंजेक्शन दिया जाना चाहिए, या ViewModel को नियंत्रक में इंजेक्शन दिया जाना चाहिए?एमवीवीएमसी और निर्भरता इंजेक्शन लागू करना

+7

शायद मैं पुराने जमाने हूँ, लेकिन क्या तुम सच में इस पैटर्न की जरूरत है? मैं लिंक किए गए लेख में लेखक द्वारा किए गए औचित्य से बहुत प्रभावित नहीं था। यह "अभी" के बजाय "क्या होगा" के लिए प्रोग्रामिंग प्रतीत होता है जो YAGNI सिद्धांत का उल्लंघन करता है। कुछ दावे भी थोड़ा चरम थे। जब भी आप अमूर्तता की एक और परत जोड़ते हैं (और यह केवल यूआई परत है जिसके बारे में हम बात कर रहे हैं), समाधान की जटिलता बढ़ जाती है। मैं उस दिन के लिए बाहर रह रहा हूं जब हमारे पास एमवीवीएमसीएमवीपीवीएमवीसी है ... नियंत्रण खींचने के लिए। –

+2

व्यूमोडेल कोड में गड़बड़ी के बारे में क्या? –

+0

मुझे लगता है कि यह इस बात पर निर्भर करता है कि आप "गड़बड़" को कैसे परिभाषित करते हैं। क्या आपके पास एक विशिष्ट समस्या है जिसे आप नियंत्रक के अतिरिक्त हल कर रहे हैं? –

उत्तर

0

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

तो मैं निश्चित रूप से एक ViewModel में नियंत्रक इंजेक्शन नहीं लगाऊंगा।

मुझे यकीन नहीं है कि मैं इसके विपरीत कर रहा हूं: नियंत्रक सामान्य रूप से नए व्यूमोडेल उदाहरण बनाने के लिए ज़िम्मेदार है। यदि आप अधिक कमजोर युग्मित कार्यान्वयन के लिए जाना चाहते हैं, तो आप सीधे अपने व्यू मॉडेल कक्षाओं के नए उदाहरण बनाने से बचने के लिए, नियंत्रक में एक अमूर्त कारखाने को इंजेक्शन देने के लिए जा सकते हैं।

+0

लेकिन जब मैं कंट्रोलर को व्यूमोडेल में इंजेक्ट करता हूं तो यह अभी भी एमवीवीएम पैटर्न होगा - वास्तव में। नियंत्रक के पास सभी तर्क हैं, जो मॉडल देखने के लिए प्रदान किए जाते हैं (एक नियंत्रक वर्ग में)। नियंत्रक में इंजेक्शन वाली कई सेवाएं हैं। यह गलत है? –

4

यह आपके द्वारा किए जा रहे कार्यों पर निर्भर करता है। मुझे लगता है कि ज्यादातर समय नियंत्रक को इंजेक्शन देने की आवश्यकता नहीं होगी, लेकिन यदि इसकी आवश्यकता है, तो ViewModel में इसकी आवश्यकता होने की अधिक संभावना है। मुझे समझाने दो।

नियंत्रक के साथ आप क्या कर रहे हैं? आपको कुछ करना होगा .. यदि वह "कुछ" पूरी तरह से "डेटा जैसा दिखता है" से संबंधित है, तो यह दृश्य में है। यदि यह "उपयोगकर्ता को क्या दिखाया जा रहा है" से संबंधित है तो यह व्यूमोडेल में है।

मैं अपने व्यू मॉडल्स में से एक में नियंत्रक इंजेक्शन कर रहा हूं। मेरा व्यू मॉडेल डेटा का प्रतिनिधित्व करता है जिसे फिर व्यू में लपेटा जाता है। मेरे पास एक कमांड है जो वर्तमान ग्राफ से डेटा ग्राफ़ को नए ग्राफ में ले जाता है। चूंकि यह बदलता है "ग्राफ विंडो में क्या प्रदर्शित किया जा रहा है" मैंने अपने व्यूमोडेल में कमांड लागू किया। ViewModel डेटा आइटम को अपने स्वयं के संग्रह से हटा देता है, और फिर उस नए डेटा के लिए नए दृश्य के लिए अनुरोध करने के लिए नियंत्रक का उपयोग करता है (इसमें पहले से ही यह कार्यक्षमता थी)।

लेख को देखते हुए, मैं नियंत्रक और दृश्य From the article you linked

7

MVVMC बस एक MVC जहां दृश्य एक ViewModel जोड़ी ने ले ली है है के बीच तीर दिखाई नहीं देता।

  • व्यू केवल एक्सएमएमएल आधारित प्रौद्योगिकियों में शक्तिशाली डेटा बाध्यकारी तंत्र का लाभ लेने वाले व्यूमोडेल के साथ इंटरैक्ट करता है।
  • व्यूमोडेल नियंत्रक को सूचित कर सकता है लेकिन नियंत्रक को कभी इंजेक्ट नहीं करना चाहिए।

मैंने एमएसडीएन पर जोश स्मिथ के अच्छी तरह से ज्ञात नमूने के आधार पर एक साधारण नमूना रखा है ... जहां मैंने नियंत्रक पेश किया है।

0

मुझे विश्वास है कि नियंत्रक को एक अमूर्त आईकंट्रोलर के रूप में इंजेक्शन दिया जाना चाहिए। व्यूमोडेल को एक अलग दृश्य/व्यू मॉडेल पर नेविगेट करने में सक्षम होने के लिए आईकंट्रोलर की आवश्यकता होती है।

उदाहरण के लिए

, ViewModel में:

IController _controller; 

public MyViewModel(IController controller){ 
    _controller = controller; 
} 

void NavigateHome(); 
{ 
    _controller.NavigateHome(); 
} 

अमूर्त IController इन कारणों के लिए नियंत्रक ही इंजेक्शन लगाने से बेहतर है:

  1. Testability। आप एक नकली आईकंट्रोलर इंजेक्ट कर सकते हैं और ViewModel
  2. Decoupling का परीक्षण कर सकते हैं। ViewModel को नियंत्रक को नहीं पता है।

मैंने डब्ल्यूपीएफ में एमवीवीएमसी करने के लिए हल्के ढांचे का विकास किया। एएसपी.नेट कोर में एमवीसी के साथ इसका बहुत समानता है।

यदि आप एक WPF समाधान की तलाश में हैं तो इसे देखें। http://michaelscodingspot.com/2017/02/15/wpf-page-navigation-like-mvc-part-2-mvvmc-framework/

GitHub: प्रलेखन के साथ

ब्लॉग पोस्ट https://github.com/michaelscodingspot/WPF_MVVMC