2012-10-26 10 views
32

एक एमवीवीएम कार्यान्वयन में, प्रत्येक ViewModel केवल एक Model के साथ जोड़ा गया है?एमवीवीएम में, प्रत्येक व्यू मॉडेल केवल एक मॉडल के साथ मिलकर है?

मैं एक परियोजना में एमवीवीएम पैटर्न को लागू करने की कोशिश कर रहा हूं लेकिन मुझे लगता है कि कभी-कभी, View को एकाधिक Models से जानकारी की आवश्यकता हो सकती है।

उदाहरण के लिए, एक UserProfileView के लिए, अपने UserProfileViewModelUserAccountModel से जानकारी, UserProfileSettingsModel, UserPostsDataModel, आदि

हालांकि, ज्यादातर लेख में मैं MVVM के बारे में पढ़ा आवश्यकता हो सकती है, ViewModel केवल निर्भरता इंजेक्शन के माध्यम से एक मॉडल पर होते हैं। तो निर्माता केवल एक मॉडल में लेता है।

ViewModel कैसे काम करेगा जब इसे एकाधिक Models से जानकारी प्राप्त होनी चाहिए? या ऐसी स्थिति कभी भी एमवीवीएम में होगी?

पीएस: मैं प्रिज्म या यूनिटी फ्रेमवर्क का उपयोग नहीं कर रहा हूं। मैं एक ऐसे प्रोजेक्ट में समान पैटर्न को लागू करने की कोशिश कर रहा हूं जिसे मैं काम कर रहा हूं जिस पर प्रिज्म या एकता का उपयोग नहीं किया जाता है। यही कारण है कि मुझे यह समझने की ज़रूरत है कि इनमें से कुछ चीजें कैसे काम करती हैं।

+0

क्या है आपको लगता है एक ViewModel करने के लिए बाध्य नहीं किया जा सकता डेटा के विभिन्न स्रोत? – Akku

+0

व्यू केवल निर्भरता इंजेक्शन के माध्यम से एक मॉडल पर होता है। तो निर्माता केवल एक मॉडल में लेता है। – Carven

+0

कृपया मेरी टिप्पणी दोबारा पढ़ें: आपको क्या लगता है कि व्यूमोडेल (दृश्य नहीं) अलग-अलग अन्य मॉडलों (व्यू मॉडल्स नहीं) से बंधे नहीं जा सकते हैं – Akku

उत्तर

34

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

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

किसी प्रस्तुति पैटर्न के रूप में, बिंदु केवल उस डेटा को प्राप्त करने की प्रक्रिया से, स्क्रीन पर कुछ डेटा दिखाने की प्रक्रिया को अलग करने के लिए है। इस तरह आप प्रक्रिया के प्रत्येक भाग को अलग से जांच सकते हैं।

संपादित करें: यहां निर्भरता के प्रवाह का एक छोटा लेकिन उम्मीदपूर्वक पूरा उदाहरण है।

// Model/service layer 

public class MyModelA 
{ 
    public string GetSomeData() 
    { 
    return "Some Data"; 
    } 
} 

public class MyModelB 
{ 
    public string GetOtherData() 
    { 
    return "Other Data"; 
    } 
} 

// Presentation layer 

public class MyViewModel 
{ 
    readonly MyModelA modelA; 
    readonly MyModelB modelB; 

    public MyViewModel(MyModelA modelA, MyModelB modelB) 
    { 
    this.modelA = modelA; 
    this.modelB = modelB; 
    } 

    public string TextBox1Value { get; set; } 

    public string TextBox2Value { get; set; } 

    public void Load() 
    { 
    // These need not necessarily be populated this way. 
    // You could load an entity and have your properties read data directly from it. 
    this.TextBox1Value = modelA.GetSomeData(); 
    this.TextBox2Value = modelB.GetOtherData(); 
    // raise INotifyPropertyChanged events here 
    } 
} 

public class MyView 
{ 
    readonly MyViewModel vm; 

    public MyView(MyViewModel vm) 
    { 
    this.vm = vm; 
    // bind to vm here 
    } 
} 

// Application layer 

public class Program 
{ 
    public void Run() 
    { 
    var mA = new MyModelA(); 
    var mB = new MyModelB(); 
    var vm = new MyViewModel(mA, mB); 
    var view = new MyView(vm); 
    vm.Load(); 
    // show view here 
    } 
} 
+0

धन्यवाद! उदाहरण वास्तव में विचार को स्पष्ट करने में मदद करता है। +1 :) – Carven

1

आमतौर पर प्रति मॉडल एक व्यूमोडेल होता है। इन व्यू मॉडल्स में मॉडल के डेटा को संभालने के लिए तर्क शामिल है। दूसरी तरफ हर दृश्य में इसका स्वयं का दृश्य मॉडल भी है। तो इसका मतलब है:

class ModelA 
{ 
    bool TestValue{get;set;} 
} 
class ViewModelA<ModelA> 
{ 
    ValueViewModel<bool> TestValue{get; private set;} 

    public ViewModelA(ModelA model) 
    { 
     base.Model = model; 
     this.Initialize(); 
    } 
} 

class ModelB 
{ 
    string Username; 
} 
class ViewModelB<ModelB> 
{ 
    ValueViewModel<string> Username{get; private set;} 

    public ViewModelB(ModelB model) 
    { 
     base.Model = model; 
     this.Initialize(); 
    } 
} 

ये व्यू मॉडेल हैं जो मॉडल को समाहित करते हैं। विचारों को अपने स्वयं के ViewModels है:

public ViewModelForExactlyOneView 
{ 
    public ViewModelA{get;set;} 
    public ViewModelB{get;set;} 
} 

आपके प्रश्न का उत्तर करने के लिए, ViewModel1 ViewModelA और ViewModelB को दर्शाता है। इसलिए दृश्य ViewModel1.ViewModelA.TestValue से इसका डेटा प्राप्त कर सकता है।

+1

हुह? आप फिर से लिखना चाहते हैं कि थोड़ा और स्पष्ट हो। यह आपकी कहानियों की तरह लगता है कि एक दृश्य में मेरे लिए एकाधिक व्यूमोडल्स होना चाहिए। –

+1

क्या "हर दृश्य में इसका स्वयं का व्यूमोडेल है" समझ में नहीं आता है? मेरी बुरी भाषा कौशल के लिए खेद है, लेकिन मैं आपसे पूरी तरह से सहमत हूं। एक दृश्य बिल्कुल एक दृश्य मॉडल से जुड़ा हुआ है। लेकिन यह ViewModel स्वयं कई अन्य ViewModels का संदर्भ दे सकता है। – PVitt

+0

@agrothe: मैंने ViewModels के उपयोग को स्पष्ट करने की कोशिश की। मेरी बुरी भाषा कौशल के लिए खेद है ... – PVitt

14

आप एक दृश्य मॉडल में एकाधिक मॉडल का उपयोग कर सकते हैं। दृश्य मॉडल का उद्देश्य व्यवसाय/डेटा परत (यानी मॉडल) को दूर करना है।

हालांकि, एक से अधिक मॉडल का उपयोग आमतौर पर इंगित करता है कि दृश्य बहुत बड़ा है। आप इसे उपयोगकर्ता नियंत्रण में विभाजित करना चाहते हैं (जिसमें उनके स्वयं के दृश्य मॉडल हैं)।

+0

धन्यवाद! लेकिन व्यूमोडेल में कई मॉडलों को इंजेक्शन कैसे दिया जाएगा? यूएमएल आरेखों से, मैं देखता हूं कि आमतौर पर, व्यूमोडेल में केवल एक पैरामीटर होता है जो एक मॉडल में होता है। – Carven

+0

आप जो भी उपयोग करते हैं उस पर निर्भर करता है। कोई भी आईओसी कई मॉडलों को इंजेक्ट कर सकता है। कैलिबर्न के लिए भी चला जाता है। मिक्रो (मेरा पसंदीदा एमवीवीएम फ्रेमवर्क) – jgauffin

+0

हम्म ... मुझे समझ में नहीं आता कि आईओसी व्यूमोडेल में एकाधिक मॉडलों को इंजेक्ट करने में सक्षम कैसे होगा जब व्यूमोडेल में केवल इसके कन्स्ट्रक्टर में व्यू के लिए एक ही पैरामीटर होगा? मैं इस तरह की संरचना को देख रहा हूं: http://i.imgur.com/ZKEDz.png – Carven

2

एक व्यू मॉडेल कई मॉडलों में कई मॉडल का उपयोग कर सकता है। यह स्वयं आपके विचार का "मॉडल" है।

एक प्रोफ़ाइल स्क्रीन पर विचार करें जो उपयोगकर्ता अपनी व्यक्तिगत जानकारी को पते सहित दर्ज करता है। यदि पता "पते" तालिका में और बाकी को "प्रोफ़ाइल" तालिका में संग्रहीत किया जाता है, तो व्यूमोडेल एक एकीकृत व्यूमोडेल बनाने के लिए प्रोफ़ाइल और पता मॉडल दोनों का उपयोग करता है।

jgauffin के रूप में उनके उत्तर में उल्लेख किया गया है, कई बार आप एक से एक रिश्ते को प्राप्त करने के लिए उपयोगकर्ता नियंत्रण का उपयोग कर सकते हैं, लेकिन आप इस 100% समय की कोशिश करके अनावश्यक जटिलता भी पेश कर सकते हैं।

2

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

आमतौर पर वास्तव में केवल एक दृश्य मॉडल होना चाहिए। लेकिन अगर यह बहुत जटिल है, तो आप Binding to ViewModel.SubClass.Property (sub-property)

में वर्णित बाध्य वस्तुओं की उपप्रोपर्टी का उपयोग कर सकते हैं व्यूमोडेल डेटा को कई अलग-अलग स्रोतों, व्यावसायिक वस्तुओं, डेटाबेस, जो भी हो, से देखने के लिए प्राप्त कर सकता है।

4

एक viewmodel "दृश्य तर्क" शामिल हैं - ताकि आप दृश्य पर प्रदर्शित करना चाहते हैं viewmodel के माध्यम से सामने आ रहा है। यदि आप अलग-अलग "मॉडल" से डेटा दिखाना चाहते हैं तो आपका व्यूमोडेल इसे एग्रेगेट करेगा और दृश्य बाध्य हो सकता है।

एमवीवीएम का मुख्य उद्देश्य बीटीडब्ल्यू यूनिट परीक्षण था। यूआई के बिना दृश्य तर्क का यह आसान परीक्षण है।

संपादित करें: आप क्यों सोचते हैं:

ViewModel केवल अपने निर्माता में दृश्य के लिए एक एकल पैरामीटर है

EDIT2:

वहाँ

btw दो मुख्य दृष्टिकोण MVVM के साथ काम करने , पहला "पहले देखें" दूसरा "व्यूमोडेल फर्स्ट" है, आप निश्चित रूप से दोनों को मिलाकर अपनी आवश्यकताओं के लिए सर्वोत्तम दृष्टिकोण चुन सकते हैं।

-2

सिर्फ इस में आपके विचार

public partial class User : Login 
{ 
    public string Password { get; set; } 

    public List<Customer> customer { get; set; } 
} 

में उपयोगकर्ता मॉडल का उपयोग एक और मॉडल लॉगिन विरासत में मिला है और यह भी इस मॉडल में इस्तेमाल ग्राहक मॉडल ..

+0

किसी मॉडल में कभी भी एक मॉडल का उपयोग न करें! एमवीवीएम बिल्कुल इस डिजाइन दोष के बारे में है और इसे ViewModel अवधारणा के साथ संबोधित करना चाहता है। – PVitt

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

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