2011-06-07 22 views
6

मैं वर्तमान में एमवीवीएम पैटर्न सीख रहा हूं, और मैं जिस ट्यूटोरियल का अनुसरण कर रहा हूं वह DI के लिए एकता का उपयोग करता है। मैंने वास्तव में पहले इस तरह डीआई का उपयोग नहीं किया है और यह सिर्फ मेरे विचारों के स्पष्टीकरण चाहता था कि यह विशिष्ट कोड कैसे काम करता है।एमवीवीएम और निर्भरता इंजेक्शन

देखें में मेरे पास है:

private ViewModel vm; 

    [Dependency] 
    public ViewModel VM 
    { 
     set 
     { 
      vm = value; 
      this.DataContext = vm; 
     } 

    } 

जहां निर्भरता विशेषता एकता कह रहा है यहाँ इंजेक्षन करने के लिए। के रूप में मैं कभी नहीं स्पष्ट रूप से ऊपर संपत्ति का उपयोग कर ViewModel की एक वस्तु बनाने रहा हूँ,

 IUnityContainer container = new UnityContainer(); 
     RandomQuoteSource randomQuoteSource = new RandomQuoteSource(); 
     container.RegisterInstance<IQuoteSource>(randomQuoteSource); 
     MainWindow window = container.Resolve<MainWindow>(); 
     window.Show(); 

वास्तव में किस प्रकार काम करता है: ViewModel निर्माता एक IQuoteSource वस्तु है जो इस तरह के रूप में एकता के साथ पंजीकृत है लेता है। क्या यह सब एकता के भीतर संभाला जाता है, यदि ऐसा है तो यह कैसे प्राप्त करता है?

धन्यवाद।

उत्तर

6

इसमें एमवीवीएम पैटर्न के साथ बहुत कुछ नहीं है प्रति से, इस तथ्य के अलावा कि व्यूमोडेल पर दृश्य की निर्भरता निर्भरता इंजेक्शन के माध्यम से हल हो जाती है।

यह कैसे काम करता है, यह बहुत आसान है। वहाँ डि के लिए 3 सरल अवधारणाओं हैं:

पहले निर्भरता, जहां कुछ वस्तु निर्दिष्ट करता है कि यह कुछ पर निर्भर करता है, या तो एक निर्माता या एक संपत्ति (जो आपके उदाहरण में मामला था के माध्यम से की घोषणा है DependencyAttribute का उपयोग कर)।

दूसरी धारणा पंजीकरण, जहां निर्भरता अपने ऑब्जेक्ट के एक कार्यान्वयन रजिस्टर है (आपके मामले में, आप IQuoteSource के एक कार्यान्वयन पंजीकृत)। ध्यान दें कि आपको ViewModel पंजीकृत नहीं है, क्योंकि यह वास्तव में उस इंटरफ़ेस का कार्यान्वयन नहीं है जिस पर आप निर्भर करते हैं।

तीसरे क्या चीजों को एक साथ बांधे रखता है, है जो निर्भरता, जहां आप के लिए कुछ प्रकार को हल करने कंटेनर पूछने के समाधान है, और यह हो जाता है और क्या निर्भरता कि (घोषित वस्तु आपके मामले में पर लग रहा है, आप MainWindow को हल कर रहे हैं जिसकी ViewModel पर निर्भरता है), पंजीकृत कार्यान्वयन को हल करता है और इसे हल करता है। यह व्यवहार ऑब्जेक्ट्स के ग्राफ के संकल्प के माध्यम से कैस्केड करता है (जो IQuoteSource पर व्यूमोडेल की निर्भरता को हल करता है)।

उम्मीद है कि यह मदद करता है :)

0

क्या यह MainWindow है जो वीएम संपत्ति से संबंधित है? यदि नहीं, तो मुझे लगता है कि MainWindow को हल करने से कुछ प्रकार के संकल्प कैस्केड शुरू होते हैं जो कि किसी बिंदु पर उस वस्तु को बनाने में शामिल होता है जिसमें आपके उदाहरण में वीएम प्रॉपर्टी होती है।

यूनिटी [Dependency] से सजाए गए गुणों के लिए कैस्केड के भीतर हल करने के लिए प्रत्येक ऑब्जेक्ट की जांच करता है, और निर्भर संपत्ति प्रकार का ऑब्जेक्ट बनाता है। जब यह इस तरह की वस्तुओं को बनाता है तो यह उस कन्स्ट्रक्टर को चुनता है जिसमें सबसे अधिक पैरामीटर होते हैं, यह जानता है कि कैसे बनाया जाए, जहां आपका IQuoteSource -> RandomQuoteSource का पंजीकरण आता है।

+0

हाय, हाँ वीएम मेनविंडो की एक संपत्ति है। धन्यवाद। –

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