2013-01-02 13 views
31

क्या मेरे सभी व्यूमोडल्स को SimpleIoc में स्टोर करना सही है? उदाहरण के लिए मेरे पास तीन पेज मेनपेज, फोटो, डायरेक्टरीज़ (इसलिए तीन व्यू मॉडेल -> मेनवीएम, फोटोवीएम, डायरेक्टरीजवीएम) हैं। क्या मुझे प्रत्येक पृष्ठ में DataContext को ViewModelLocator या घोंसला ViewModels में मुख्य संपत्ति में गुणों के रूप में देखने के लिए डेटा कॉन्टेक्स्ट सेट करना चाहिए और प्रत्येक पृष्ठ को डेटाकॉन्टेक्स्ट को मुख्य में जोड़ना चाहिए। फोटोवोम्प्रर्टी, मुख्य। डायरेक्टरीज वीएमप्रोपर्टी और इसी तरह? क्या कोई मुझे आईओसी के विचार और उद्देश्य की व्याख्या कर सकता है?ViewModelLocator में ViewModels MVVM लाइट

+1

मुझे आशा है कि इससे आपकी मदद मिलेगी: http://stackoverflow.com/questions/13795596/best-tutorial-to-learn-mvvmlight-simpleioc-use – User1551892

+0

क्या आप अपने दूसरे दृष्टिकोण से संबंधित कुछ कोड प्रदान कर सकते हैं? मेनव्यूमोडेल में आप फोटोवंप्रोपर्टी को कैसे परिभाषित करते हैं ... आपका प्रश्न बहुत दिलचस्प है ... – User1551892

उत्तर

110

सबसे पहले, की सुविधा देता है क्या ViewModelLocator करता है पर देखो और कारण है कि हम इसका इस्तेमाल:

ViewModelLocator हमारे App.xaml पृष्ठ पर एक वस्तु के रूप में घोषित और एक आवेदन सिंगलटन है। हमारे पास एक होने वाला है, और उनमें से केवल एक ही एप्लिकेशन के लिए उपलब्ध होने पर उपलब्ध है।

ViewModelLocator एमवीवीएम लाइट में हमारे सभी व्यू मॉडल्स का स्रोत है। प्रत्येक व्यूमोडेल के लिए हमारे पास ViewModelLocator पर एक संपत्ति होगी जो हमें दृश्य के लिए व्यूमोडेल प्राप्त करने की अनुमति देती है। इस कोड को इस तरह दिखता है:

public class ViewModelLocator 
{ 
    public MainPageViewModel MainPage 
    { 
     get { return new MainPageViewModel(); } 
    } 
} 

यह मेरा App.xaml का एक टुकड़ा है:

<Application.Resources> 
    <vm:ViewModelLocator 
     x:Key="ViewModelLocator" /> 
</Application.Resources> 

यह View.xaml

से एक टुकड़ा
DataContext="{Binding MainPage, Source={StaticResource ViewModelLocator}}" 

अब तक तो अच्छा है। अपने पहले प्रश्न का उत्तर देने के लिए, क्या आपको एमवीवीएम लाइट में आईओसी का उपयोग करना है? नहीं। ViewModelLocator द्वारा पूरी तरह से निर्मित और तत्काल आपके दृश्य में आपके व्यूमोडेल को कोई आवश्यकता नहीं है।

अब, आपके दूसरे प्रश्न पर: आईओसी का उद्देश्य क्या है?

MVVM लाइट के साथ

आप इस तरह से ऊपर कार्य करें::

आईओसी आपको निम्न कार्य करने की अनुमति देने के लिए बनाया गया है

public class ViewModelLocator 
{ 
    public ViewModelLocator() 
    { 
     ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); 

     if (ViewModelBase.IsInDesignModeStatic) 
     { 
      SimpleIoc.Default.Register<IDataService, Design.DesignDataService>(); 
     } 
     else 
     { 
      SimpleIoc.Default.Register<IDataService, DataService>();   
     } 

     SimpleIoc.Default.Register<MainViewModel>(); 
    } 

    public MainViewModel Main 
    { 
     get { return SimpleIoc.Default.GetInstance<MainViewModel>(); } 
    } 
} 

public class MainViewModel 
{ 
    public ObservableCollection<Foo> Foos { get; set; } 

    public MainViewModel(IDataService dataService) 
    { 
     _dataService=dataService; 
     Foos=_dataService.GetFoos(); 
    } 
} 

जब मैं अपने MainViewModel हल जब मैं फोन

SimpleIoc.Default.GetInstance<MainViewModel>() 

आंतरिक रूप से क्या होता है यह है कि SimpleIoc यह देखने के लिए जांच करता है कि मेनव्यूमोडेल की कोई निर्भरता है (इसके निर्माता में पैरामीटर)। इसके बाद यह उन मानदंडों को हल करके इन पैरामीटर को हल करने का प्रयास करता है जो इसके साथ पंजीकृत हैं। यह रिकर्सिवली करता है, इसलिए यदि DataService निर्भरता था यह instantiated और DataService निर्माता जब यह रूप में अच्छी तरह instantiated किया जा रहा था के लिए पारित किया जाएगा।

मैं यह सब क्यों करूँगा?

  1. अपनी कक्षाओं आसानी से इकाई बनाने परीक्षण योग्य
  2. अपने कोड इंटरफ़ेस संचालित करें। इसका मतलब है कि आप कंक्रीट कक्षाओं के बजाय इंटरफेस का संदर्भ दे रहे हैं
  3. अपना कोड कम से कम युग्मित करें। इसका मतलब यह है कि कोई इंटरफ़ेस और कक्षाओं के कार्यान्वयन को बदल सकता है जो उपभोग करते हैं कि इंटरफेस परवाह नहीं है और फिर से कोडित नहीं किया जाना चाहिए।
  4. अपने वर्ग निर्भरताओं को एक स्वचालित तरीके से हल करें।
  5. एमवीवीएम लाइट में, आप देखेंगे कि यह डिज़ाइन मोड (ViewModelBase.IsInDesignModeStatic) में चल रहा है, इसका मतलब यह है कि आप अपने व्यूमोडेल डेटा प्रदान करने के लिए डिज़ाइन-टाइम सेवाएं बना सकते हैं ताकि विजुअल स्टूडियो में आपका दृश्य वास्तविक डेटा हो ।
+0

उत्कृष्ट ब्रेक डाउन और विषय वस्तु का जवाब। धन्यवाद। – usefulBee

+0

बिल्कुल सही, मेरे बहुत सारे समय बचाया। – Ahmed

+1

... और यदि आपने कभी सोचा है कि क्या आपका इनपुट लाइन के नीचे वर्षों से मायने रखता है, हाँ यह करता है। यह * बिल्कुल * टूटने का तरीका है और इसके माध्यम से चलने से मुझे यह समझने में मदद मिली कि क्या हो रहा है। धन्यवाद! – Fred

1

एमवीवीएम लाइट में बहुत अच्छी सुविधाएं हैं लेकिन ऐसा लगता है कि सेवा लोकेटर दृश्य मॉडल पर विचारों की अवांछित निर्भरता बनाता है। आदर्श रूप से, मैं लाइब्रेरी ए में व्यूमोडेलोकेटर, लाइब्रेरी बी में दृश्य मॉडल और लाइब्रेरी सी में विचार देखना चाहता हूं। फिर मैं भविष्य की परियोजनाओं के लिए आवश्यकतानुसार मिश्रण और मिलान कर सकता हूं। हालांकि, एमवीवीएम लाइट के डिजाइन में, जहां तक ​​मैं देख सकता हूं, दृश्य (लाइब्रेरी सी) हमेशा ViewModelLocator पर निर्भरता रखेगा (यह ठीक है) लेकिन क्योंकि ViewModelLocator (लाइब्रेरी ए) हमेशा पर निर्भरता रखेगा मॉडल (लाइब्रेरी बी) देखें, फिर विचार हमेशा दृश्य मॉडल पर निर्भर होंगे (यह ठीक नहीं है क्योंकि दृश्य में अब सभी दृश्य मॉडल पुस्तकालयों को शामिल करना होगा, जिनका उपयोग कभी भी सभी उत्पादों के साथ किया जाता था)।

मुझे विश्वास है कि प्रिज्म किसी भी तरह स्ट्रिंग कुंजियों का उपयोग करके इस समस्या को हल करता है। क्या मैं कुछ भूल रहा हूँ?

ओह! मुझे लगता है कि मैंने अभी अपने प्रश्न का उत्तर दिया है। समाधान लाइब्रेरी ए, सर्विस लोकेटर, एक विशेष समाधान (उत्पाद) के लिए विशिष्ट बनाना है। इसके बाद केवल उस समाधान के लिए दृश्य मॉडल का संदर्भ शामिल है। फिर विचार इस सेवा लोकेटर पर निर्भर करते हैं जो बदले में उस उत्पाद के सभी दृश्य मॉडल पर निर्भर करता है। अंतिम परिणाम यह है कि विचार केवल उन दृश्य मॉडल पर निर्भर करते हैं जिनका उपयोग उस उत्पाद के लिए किया जाएगा। आपके साथ कोई समस्या नहीं है कि हम प्रत्येक समाधान के लिए ServiceLocator को डुप्लिकेट कर रहे हैं क्योंकि इस मॉड्यूल में केवल कोड है जो समाधान के लिए विशिष्ट है। ServiceLocator के घटक जैसे कि सरल Ioc क्लास, सभी समाधानों के लिए आम हैं, लेकिन इन्हें पुन: प्रयोज्य कक्षाओं में शामिल किया गया है जिसे हम ServiceLocator में आमंत्रित करते हैं।

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

संबंधित मुद्दे