2012-08-31 23 views
8

का उपयोग करने का उचित तरीका Messenger कक्षा का उपयोग करने का सही तरीका क्या है? मुझे पता है कि इसका उपयोग ViewModels/Views संचार के लिए किया जा सकता है, लेकिन क्या यह तकनीकी/व्यावसायिक सेवा परत के लिए इसका उपयोग करने का एक अच्छा तरीका है?एमवीवीएम लाइट मैसेंजर

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

using System; 
using System.Windows; 
using System.Windows.Navigation; 
using Microsoft.Phone.Controls; 
using App.Service.Interfaces; 
using GalaSoft.MvvmLight.Messaging; 

namespace App.Service 
{ 
    public class NavigationService : INavigationService 
    { 
     private PhoneApplicationFrame _mainFrame; 

     public event NavigatingCancelEventHandler Navigating; 

     public NavigationService() 
     { 
      Messenger.Default.Register<NotificationMessage<Uri>>(this, m => { this.NavigateTo(m.Content); }); 
     } 

     public void NavigateTo(Uri pageUri) 
     { 
      if (EnsureMainFrame()) 
      { 
       _mainFrame.Navigate(pageUri); 
      } 
     } 

     public void GoBack() 
     { 
      if (EnsureMainFrame() 
       && _mainFrame.CanGoBack) 
      { 
       _mainFrame.GoBack(); 
      } 
     } 

     private bool EnsureMainFrame() 
     { 
      if (_mainFrame != null) 
      { 
       return true; 
      } 

      _mainFrame = Application.Current.RootVisual as PhoneApplicationFrame; 

      if (_mainFrame != null) 
      { 
       // Could be null if the app runs inside a design tool 
       _mainFrame.Navigating += (s, e) => 
       { 
        if (Navigating != null) 
        { 
         Navigating(s, e); 
        } 
       }; 

       return true; 
      } 

      return false; 
     } 
    } 
} 
+0

आगे पढ़ने के लिए: [वैश्विक घटनाओं को हानिकारक माना जाता है] (http://dkturner.blogspot.hu/2010/06/global-events-cononsidered-harmful.html) – nemesv

+0

धन्यवाद, एक गूढ़ दृष्टिकोण प्रतीत होता है। लेकिन यह एमवीवीएम मैसेंजर – Cybermaxs

उत्तर

23

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

व्यूमोडेल जो खोज डेटा प्राप्त करता है, वह केवल एक "खोज" संदेश भेजता है जिसे वर्तमान में संदेश का उपभोग करने के लिए पंजीकृत किया गया था।

यहाँ लाभ हैं: एक दूसरे को

  • के बारे में पता करने के लिए मैं एक उपभोक्ता को प्रभावित किए बिना निर्माता बाहर स्वैप कर सकते हैं होने प्रत्येक viewmodel बिना ViewModels के बीच

    1. आसान संचार।
    2. मैं कम प्रयास के साथ उपभोक्ताओं को अधिक संदेश जोड़ सकता हूं।
    3. यह ViewModels सरल रहता है

    संपादित करें: तो, सेवाओं के बारे में क्या?

    व्यू मॉड्यूल यूआई में डेटा पेश करने के बारे में हैं। वे आपका डेटा लेते हैं और इसे किसी ऐसे रूप में आकार देते हैं जिसे आपके दृश्य में प्रस्तुत किया जा सकता है। ViewModels सेवाओं से अपना डेटा मिलता है।

    एक सेवा ViewModel को डेटा और/या व्यावसायिक तर्क प्रदान करती है। सेवा नौकरी सेवा मॉडल अनुरोधों की सेवा है। यदि किसी सेवा को अपनी नौकरी करने के लिए अन्य सेवाओं को संवाद/उपयोग करने की आवश्यकता है तो इन्हें निर्भरता इंजेक्शन का उपयोग करके सेवा में इंजेक्शन दिया जाना चाहिए। सेवाएं आमतौर पर एक संदेशवाहक का उपयोग कर एक दूसरे के साथ संवाद नहीं करेंगे। मेसेंजर व्यूमोडेल स्तर पर क्षैतिज संचार के बारे में बहुत कुछ है।

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

    जब आप अनुरोध/प्रतिक्रिया प्रकार अनुरोध कर रहे हों तो किसी सेवा को इंजेक्शन देने के बजाय मैसेंजर का उपयोग करना कोई समझ नहीं आता है क्योंकि आपको ऐसा करने के लिए और अधिक कोड लिखना होगा, आपको केवल इंजेक्शन देना होगा सेवा सीधे और यह कोड को पढ़ने के लिए मुश्किल बनाता है।

    ऊपर अपना कोड देख रहे हैं। कल्पना कीजिए कि क्या आपको वहां प्रत्येक विधि के लिए एक ईवेंट लिखना था (नेविगेट, कैनवविगेट, गोबैक, गोफॉरवर्ड, आदि)। आप बहुत सारे संदेशों के साथ खत्म हो जाएगा। आपका कोड भी पालन करना कठिन होगा।

  • +0

    के लिए विशिष्ट नहीं है, लेकिन सेवाओं के बारे में क्या? – Cybermaxs

    +0

    इस दोस्त को अनुमान लगाकर आपका जवाब फट गया? http://www.codeproject.com/Tips/696340/Thinking-in-MVVMLight-Messenger –