2011-05-19 16 views
5
के 2 अलग-अलग विविधताएं

मैं निम्नलिखित सेटअप:प्रिज्म: EventAggregator और MEF - EventAggregator

  • xaps/मॉड्यूल भर में एक Silverlight अनुप्रयोग विभाजन
  • मैं डि ढांचे के रूप में MEF का उपयोग विभिन्न भागों कनेक्ट करने के लिए मेरे आवेदन का

  • 2 क्षेत्रों है:

  • एक (बाएं से एक) के साथ एक सूची दृश्य (जैसे ग्राहकों के लिए)

  • एक (सही) से भर जाता है युक्त एक दृश्य के साथ से भर जाता है क्षेत्र के साथ एक tabcontrol जो मैंने पॉप्युलेट किया ( के अनुसार ग्राहक को चुना गया है) के साथ एक अन्य दृश्य में एक क्षेत्र के साथ एक टैब नियंत्रण होता है।

    दाईं ओर परिणाम: enter image description here

प्रथम स्तर TabControl मैं "ग्राहक बदल घटना" सुन रही हूँ भर दें - और (इस महान काम करता है) जब मैं घटना मैं पॉप्युलेट प्राप्त मिल दृश्य के साथ पहली स्तर टैब क्षेत्र:

Dim lReg As IRegion = Me.mRegionManager.Regions("FirstLevelTabReqion") 
    Dim lViewID As String = CommonDefinitions.Constants.BuildFirstLevelViewName(lUniqueID) 
    Dim lFirstLevelView FirstLevelView = TryCast(lReg.GetView(lRqViewID), FirstLevelView) 
    If lFirstLevelView Is Nothing Then  
     lFirstLevelView = New FirstLevelView() 
     Dim lRegMan1 As IRegionManager = lReg.Add(lFirstLevelView, lViewID, True) 
     lFirstLevelView.SetRegionManager(lRegMan1) 
     ... 
    End If 

नोट: जब FirstLevelView मैं एक CompositionInitializer.SatisfyImports कॉल में फेंक करने के लिए है बनाने FirstLevelView सुनिश्चित करने के लिए इसके ViewModel संदर्भ को हल करता है।

SecondLevel ViewModel में EventsAggregator का एक उदाहरण प्राप्त करने के लिए मैं का उपयोग करें:

<ImportingConstructor()> 
    Public Sub New(ByVal iEvAggregator As IEventAggregator) 
      EventAggregator = iEvAggregator 
      EventAggregator.GetEvent(Of DoStuffSecondLevel).Subscribe(AddressOf OnDoStuffSecondLevel, True) 

    End Sub 

मेरे समस्या यह है कि EventAggregator उदाहरण मैं दूसरे स्तर दृश्य मॉडल में मिलता प्रथम स्तर में EventAggregator उदाहरण से अलग है इसलिए यदि मैं पहले स्तर पर DoStuffSecondLevel प्रकाशित करता हूं तो यह दूसरे स्तर पर नहीं पकड़ा जाएगा।

मुझे EventAggregator के 2 अलग-अलग उदाहरण क्यों मिलते हैं?
एप्लिकेशन भर में EventAggregator का एक ही उदाहरण साझा करने के लिए मैं क्या कर सकता हूं?

अग्रिम

+0

मैं इस में जोड़ना चाहता हूं कि मैं एक ही मुद्दे में भाग गया। मुझे एक समाधान चाहिए जहां मुझे 'घटक प्रारंभकर्ता। सत्सिफी आयात (यह) का उपयोग करके समान इंस्टेंस प्राप्त होता है;' मैंने 'घटक प्रारंभकर्ता। सत्सिफी आयात (...)' का उपयोग किया ताकि मैं नया()) अन्य (मेरे) अपने राज्यों को मैन्युअल रूप से रीसेट नहीं करना है), जिसने मुझे संतुष्ट आयात का उपयोग करने के लिए प्रेरित किया ताकि मैं अपनी सेवाएं, मुख्य रूप से EventAggregator प्राप्त कर सकूं। – michael

+0

कृपया कुछ चीजें जांचें: 1. जब आप अपना एमईएफ कंटेनर कॉन्फ़िगर करते हैं, तो क्या आप CreationPolicy.NonShared पर डिफ़ॉल्ट निर्माण नीति सेट कर रहे हैं? 2. क्या आपके पास अपने EventAggregator कक्षा पर PartCreationPolicy विशेषता है? 3. क्या यह संभव है कि आप SecondLevelViewModel के लिए एक अलग कंपोज़िशनकंटर ऑब्जेक्ट बना रहे हों? –

उत्तर

3

समस्या धन्यवाद कि MefBootstrapper एक कंटेनर बनाता है लेकिन डिफ़ॉल्ट कंटेनर के रूप में यह दर्ज नहीं करता है। जब संतुष्ट आयात कहलाता है, एमईएफ को कोई कंटेनर नहीं दिखता है, इसलिए यह एक नया बनाता है। यही कारण है कि उदाहरण अलग हैं, क्योंकि 2 अलग-अलग कंटेनर बनाए जा रहे हैं। इसे हल करने के लिए, प्रिज्म कंटेनर को उपयोग करने के लिए एमईएफ के लिए डिफ़ॉल्ट कंटेनर के रूप में सेट करें।

सिल्वरलाइट समाधान (अपने bootstrapper में):

protected override void InitializeShell() 
{ 
    base.InitializeShell(); 

    //Make the container the default one. 
    CompositionHost.Initialize(this.Container); 

    //Etc. 
} 

WPF (डेस्कटॉप) समाधान:

वर्तमान में, मैं डेस्कटॉप समाधान काम करने के लिए नहीं मिल सकता है। समस्या यह है कि एमईएफ का ExportFactory<T> और ComponentInitializer सिल्वरलाइट ऐप्स (क्यों !?) के लिए उपलब्ध है।ग्लेन ब्लॉक ने एक लाइब्रेरी बनाई है जो System.ComponentModel.Composition.Initialization.dll लाइब्रेरी के डेस्कटॉप संस्करण तक पहुंच प्रदान करती है। मैंने इसका उपयोग करने का प्रयास किया, लेकिन यह असफल रहा क्योंकि कोड में यह असफल होने के लिए सेट है यदि कोई कंटेनर पहले से मौजूद है ... फिर, क्यों? मैंने अभी तक इस समाधान के साथ MEF2 (Codeplex पूर्वावलोकन) का उपयोग करने का प्रयास नहीं किया है, लेकिन मुझे लगता है कि यह बेहतर काम करेगा (शायद)। कष्टप्रद हिस्सा यह है कि यदि आप एमईएफ 2 (कोडप्लेक्स) का उपयोग करना चुनते हैं तो आपको प्रिज्म बाइनरी का पुनर्निर्माण करना होगा और कोडप्लेक्स एमईएफ 2 लाइब्रेरी के साथ .NET 4 MEF लाइब्रेरी के सभी संदर्भों को प्रतिस्थापित करना होगा। इससे प्रिज्म को शिकायत किए बिना कोडेप्लेक्स एमईएफ 2 लाइब्रेरी के साथ काम करने की क्षमता मिलती है। मैं यह देखने की कोशिश करूंगा कि ऐसा करने से यह समाधान WPF के साथ व्यवहार्य हो जाता है।

+0

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

+0

@ m-y कोई भाग्य इसे काम करने के लिए मिल रहा है? –

+0

@ बहरिगंगर: मैंने ऐसा किया, मुझे प्रिज्म (डेस्कटॉप) को सिस्टम को बदलकर संकलित करने के लिए मिला। एमओएफ 2 (कोडेप्लेक्स) पुस्तकालयों के साथ कॉम्पोनेंट मॉडेल संदर्भ, फिर समाधान को दोबारा जोड़ना। मुझे लगता है कि यह मेरे डब्ल्यूपीएफ ऐप में शामिल है और .NET 4 MEF के बजाय MEF2 (Codeplex) लाइब्रेरी का संदर्भ देता है। इसने मुझे 'ExportFactor ' का उपयोग करने की अनुमति दी, लेकिन संतुष्ट आयात अभी भी थोड़ी छोटी थी। –

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