2012-09-20 11 views
13

मैं सिर्फ डब्ल्यूपीएफ और कैलिबर्न सीख रहा हूं। माइक्रो। मैं यहां प्रस्तुत कोड का पालन कर रहा हूं: http://caliburnmicro.codeplex.com/wikipage?title=Customizing%20The%20Bootstrapper&referringTitle=Documentationकैलिबर्न। एमपीआरओ और एमईएफ wpf

स्पष्ट रूप से यह कोड सिल्वरलाइट के लिए है लेकिन मेरी परियोजना एक WPF है और इस कारण से मुझे त्रुटि मिल रही है कि कंपोज़िशनहोस्ट परिभाषित नहीं है।

दस्तावेज़ ने कहा कि मुझे कंटेनर को सीधे wpf में प्रारंभ करने की आवश्यकता है, लेकिन यह दिखाने के लिए कोई दस्तावेज़ नहीं है कि कैसे। मैं कंटेनर को सीधे कैसे शुरू कर सकता हूं?

संपादित करें 1 बूट साईस दस्तावेज में इस तरह है:

 container = CompositionHost.Initialize(
     new AggregateCatalog(
      AssemblySource.Instance.Select(x => new AssemblyCatalog(x)).OfType<ComposablePartCatalog>() 
      ) 
     ); 

    var batch = new CompositionBatch(); 

    batch.AddExportedValue<IWindowManager>(new WindowManager()); 
    batch.AddExportedValue<IEventAggregator>(new EventAggregator()); 
    batch.AddExportedValue(container); 

    container.Compose(batch); 

और मैं इसे करने के लिए परिवर्तित:

var catalog = 
      new AggregateCatalog(
       AssemblySource.Instance.Select(x => new AssemblyCatalog(x)).OfType<ComposablePartCatalog>()); 

     this.container = new CompositionContainer(catalog); 
     var batch = new CompositionBatch(); 

     batch.AddExportedValue<IWindowManager>(new WindowManager()); 
     batch.AddExportedValue<IEventAggregator>(new EventAggregator()); 
     batch.AddExportedValue(this.container); 

     this.container.Compose(batch); 

लेकिन जब मैं आवेदन चलाने के लिए, मैं त्रुटि हो रही है कि MEF नहीं कर सकते आईशेल

 Could not locate any instances of contract IShell. 

के लिए कार्यान्वयन ढूंढें मैं एम के प्रारंभिकता को मानता हूं ईएफ सही नहीं है। क्या आप कृपया इसे ठीक करने में मेरी मदद कर सकते हैं?

उत्तर

17

डब्ल्यूपीएफ में आपको एक स्पष्ट CompositionContainer कन्स्ट्रक्टर का उपयोग करने की आवश्यकता है। मेरी WPF और Silverlight साझा bootstrapper में मैं निम्नलिखित #if का इस्तेमाल किया है - #else निर्देश:

#if SILVERLIGHT 
    container = CompositionHost.Initialize(catalog); 
#else 
    container = new CompositionContainer(catalog); ; 
#endif 

संपादित

bootstrapper एक घटक है कि IShell इंटरफ़ेस लागू करता है की पहचान करेगा (बशर्ते आपके bootstrapper Bootstrapper<IShell> प्रदान कर रहा है बेस क्लास), इसलिए आपको IShell के एमईएफ निर्यात के साथ सजाए गए वर्ग को लागू करने की आवश्यकता है।

आमतौर पर यह अपने ShellViewModel होगा और घोषणा इस प्रकार दिखाई देगा:

[Export(typeof(IShell))] 
public class ShellViewModel : PropertyChangedBase, IShell 
{ 
    ... 
} 

आप bootstrapper सेटअप और अनुकूलन here के बारे में और अधिक पढ़ सकते हैं।

+0

धन्यवाद। प्रश्न में मेरा संपादन देखें। – mans

+0

@mans कृपया मेरा उत्तर अपडेट देखें। –

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