क्या MVVM में राज्य का प्रबंधन करने के लिए एक अच्छा औपचारिक पैटर्न है?


21

मैंने वेब-दुनिया में Redux और React के बारे में सीखना शुरू कर दिया है, और जितना अधिक मैं इसके बारे में सीखता हूं उतना ही मुझे एहसास होता है कि डेस्कटॉप-दुनिया में WPF के MVVM- शैली की वास्तुकला के साथ कितना दर्दनाक राज्य प्रबंधन है (Caliburn का उपयोग विशेष रूप से देखने के लिए) देखने के लिए)।

Redux के कुछ सरल सिद्धांत हैं जो यह बताते हैं कि किस तरह से राज्य को प्रबंधित किया जाना चाहिए, जिससे UI अपडेट, इवेंट हैंडलिंग और राज्य अधिक पूर्वानुमान योग्य हो जाते हैं। सिद्धांत हैं:

  • सत्य का एक एकल स्रोत (सभी उत्परिवर्तित अवस्था एक ही साझा वस्तु में संग्रहीत होती है)।
  • राज्य केवल पढ़ने के लिए है। यह कोड के माध्यम से घटकों द्वारा संशोधित नहीं किया जा सकता है, जो आमतौर पर WPF में होता है।
  • राज्य को केवल शुद्ध कार्यों द्वारा संशोधित किया जा सकता है।

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

मैंने एक-दूसरे को अपडेट करने वाले अंतर-संबंधित व्यू-मेल घटकों के बीच जटिल इंटरैक्शन को समझने और समझने के लिए आरेख बनाने में घंटों बिताए हैं।

मैं समझता हूं कि Redux का लक्ष्य इस राज्य की कुछ अप्रत्याशितताओं को हल करना है। क्या ऐसा ही कुछ है, या एक वास्तुशिल्प पैटर्न जो राज्य को बेहतर ढंग से प्रबंधित करने में मदद करने के लिए WPF के साथ अच्छी तरह से फिट होगा? मुझे यकीन नहीं है कि .NET में Redux सिद्धांत कितनी अच्छी तरह काम करेंगे क्योंकि मैंने उन्हें अभी तक कोशिश नहीं की है। शायद किसी को कुछ अनुभव है जो कुछ सलाह दे सकता है?


हमें ब्राउज़र में इसी तरह की समस्याएं हैं। सीधा जावास्क्रिप्ट इतनी जल्दी चलेगा और डोम अभी तक नहीं बनाया गया है, इसलिए कोई भी यूआई तत्व नहीं खोज सकता है। सौभाग्य से कई ईवेंट हैं, हम कुछ स्क्रिप्ट के विलंबित निष्पादन को ट्रिगर करने के लिए उपयोग कर सकते हैं जब तक कि अन्य चीजें आगे नहीं होती हैं। (जैसे कि DOMContentLoaded।)
Erik Eidt

1
Redux में स्थिति वास्तव में अपडेट की जाती है, कभी भी संशोधित नहीं की जाती है।
एंडी २

1
मुझे पता है कि मैं पार्टी में देर से आता हूं, लेकिन रिएक्ट.नेट नामक एक प्रोजेक्ट है जो Redux आर्किटेक्चर को .NET पर लाता है।
साइबेरियाईगू

उन लोगों के लिए जो कोणीय परियोजनाओं में ngrx / store के दृष्टिकोण को पसंद करते हैं, वहाँ NetRx.Store है - .net परियोजनाओं के लिए राज्य प्रबंधन, ngrx / store द्वारा प्रेरित। आप इसे Nuget पर भी पा सकते हैं । इसके अलावा वहाँ एक अच्छा उपयोग के नमूना है WPF परियोजना में MVVM पैटर्न के साथ NetRx.Store
विटाली इल्चेंको

जवाबों:


8

मुझे लगता है मैं जानता हूं कि आपका मतलब क्या है। मूल रूप से आप या तो एक 'कंट्रोलर' या 'मास्टर' व्यूमाडेल (बहाना स्यूडोकोड) जोड़कर समस्या का समाधान करते हैं

अर्थात

public class MasterVM
{
    public ChildVM View1 {get;set;}
    public ChildVM View2 {get;set;}

    private Data data;
    public MasterVM()
    {
        View1.OnEvent += updateData;
    }

    private Action<int> updateData(int value)
    {
         View2.Value = value;
    }
}

जब आप मध्यस्थ पैटर्न के साथ ऐसा करते हैं, तो मैं कक्षा को नियंत्रक के रूप में समझता हूं। अर्थात।

public class Controller
{
    public Controller(MediatorService m)
    {
        m.Subscribe("valueupdated", updateData);
    }

    private Action<int> updateData(int value)
    {
         m.Publish("showvalue", value);
    }
}

public class View2
{
    public View2(MediatorService m)
    {
        m.Subscribe("showvalue", (int v)=> {Value = v;});
    }
}

इस तरह की चीज आपको अपने उच्च प्रवाह वाले वर्गों में अपने 'फ्लो लॉजिक' या ईवेंट ऑर्केस्ट्रेशन को रखने की अनुमति देती है और वीएमएन कोड को हल्का बनाए रखती है। यदि आप उपयोगकर्ता को क्लिक करने पर 'बदलना चाहते हैं, तो ऑर्डर संसाधित किया जाता है' आप 'ऑर्डरफ़्लो कॉन्ट्रोलर' या 'ऑर्डरप्रोसेसर' में देखने के लिए जानते हैं या आप उन्हें नाम देना चाहते हैं। बास्केट वीएम, पेमेंट वीएम, 3 डी सेक्योरवीएम आदि के संयोजन के बजाय

तो 'अभी तक तैयार नहीं' के आपके विशिष्ट उदाहरण में आपके पास हो सकता है

public class Controller
{
    bool dataLoadCompleted;
    public Controller(MediatorService m)
    {
        m.Subscribe("setTabRequest", setTab); //message from view model with set tab button
        m.Subscribe("dataLoadComplete", dataLoadComplete); //message from data loading view model or some other controller?
    }

    private Action<int> setTab(int value)
    {
         if(!dataLoadCompleted)
         {
             m.Publish("error", "Please wait for data to load"); //message for error alert view model
         }
         else
         {
             m.Publish("setDefaultTab", value); //message for tab viewmodel
         }
    }

    private Action dataLoadComplete()
    {
         //persist state;
         dataLoadCompleted = true;
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.