Event Aggregators इस प्रकार की समस्या को हल करने का एक अच्छा तरीका है। असल में एक केंद्रीकृत वर्ग है (सादगी के लिए चलिए कहते हैं कि यह सिंगलटन है और एंटी-सिंगलटन लोगों के संभावित क्रोध का सामना करना पड़ता है) जो एक ऑब्जेक्ट से दूसरे ऑब्जेक्ट को स्थानांतरित करने के लिए ज़िम्मेदार है। अपने वर्ग के नाम के साथ उपयोग लग सकता है जैसे:
public class MainViewModel
{
public MainViewModel()
{
WordAddedEvent event = EventAggregator.Instance.GetEvent<WordAddedEvent>();
event.Subscribe(WordAdded);
}
protected virtual void WordAdded(object sender WordAddedEventArgs e)
{
// handle event
}
}
public class AddWordViewModel
{
//From the command
public void ExecuteAddWord(string word)
{
WordAddedEvent event = EventAggregator.Instance.GetEvent<WordAddedEvent>();
event.Publish(this, new WordAddedEventArgs(word));
}
}
इस पद्धति का लाभ यह है कि आप बहुत आसानी से बनाने शब्द और कई ViewModels कि ऐसे शब्द हैं जो जोड़ दिया गया है में रुचि रखते हैं के कई तरीके हैं करने के लिए अपने आवेदन का विस्तार कर सकते है और दोनों के बीच कोई युग्मन नहीं है ताकि आप उन्हें जोड़ और हटा सकें।
आप सिंगलटन से बचना चाहते हैं (और परीक्षण प्रयोजनों के लिए मैं आपको बस इतना सुझाव है) तो यह निर्भरता इंजेक्शन में देख लायक हो सकता है, हालांकि यह है कि वास्तव में एक पूरी अन्य मुद्दा है।
ठीक है, अंतिम विचार। मैं आपके प्रश्न को दोबारा पढ़ने से देखता हूं कि आपके पास पहले से ही कुछ प्रकार की वर्ड सर्विस क्लास है जो वर्ड ऑब्जेक्ट्स को पुनर्प्राप्त करने और संग्रहण करने के लिए संभालती है। ऐसा कोई कारण नहीं है कि जब नया व्यू जोड़ा जाता है तो ईवेंट को बढ़ाने के लिए सेवा ज़िम्मेदार नहीं हो सकती है क्योंकि दोनों व्यूमोडल्स पहले से ही इसके साथ हैं। हालांकि मैं अभी भी सुझाव देंगे EventAggregator अधिक लचीला और एक बेहतर समाधान है, लेकिन YAGNI यहां आवेदन कर सकते हैं
public class WordService
{
public event EventHandler<WordAddedEventArgs> WordAdded;
public List<string> GetAllWords()
{
//return words
}
public void SaveWord(string word)
{
//Save word
if (WordAdded != null) WordAdded(this, new WordAddedEventArgs(word));
//Note that this way you lose the reference to where the word really came from
//probably doesn't matter, but might
}
}
public class MainViewModel
{
public MainViewModel()
{
//Add eventhandler to the services WordAdded event
}
}
क्या आप यद्यपि कर एक कमांड को फोन करके ViewModels है कि आप पैदा हो जाएगी के बीच युग्मन पेश कर रहा है से बचना चाहते हैं एक व्यूमोडेल पर दूसरे के साथ, यह एप्लिकेशन को विस्तारित करने के लिए आपके विकल्पों को गंभीर रूप से सीमित कर देगा (क्या होगा यदि कोई दूसरा व्यूमोडेल नए शब्दों में दिलचस्पी लेता है, तो क्या यह अब एडवॉर्ड व्यू मॉडेल की ज़िम्मेदारी भी है?)
स्रोत
2009-04-28 17:42:49
बहुत विस्तृत के लिए धन्यवाद जवाब। इसमें खोदना होगा :) बहुत मज़ा आता है :) –
मैं अपने एमवीवीएम कार्यान्वयन के लिए एक बड़े ऑब्जेक्ट ग्राफ के साथ पूर्ण बोर ओओ चला गया।लाइन के नीचे 2 साल और संरचनात्मक परिवर्तन करना काफी कठिन है। काश मैं एग्रीगेटर/मध्यस्थ पैटर्न के लिए गया हूं क्योंकि लचीलापन भारी है। सावधान: मेमोरी लीक। सुनिश्चित करें कि आपका एग्रीगेटर कमजोर संदर्भों का उपयोग करता है। – Gusdor