2012-01-09 16 views
9

मेरे पास मेरे समाधान में एक स्थिर वर्ग है जिसका उपयोग विभिन्न असेंबली के साथ काम करने के लिए किया जाता है। मैं उन्हें एमईएफ के माध्यम से जोड़ना चाहता हूं, इसलिए मैंने कक्षा में एक क्षेत्र बनाया।सी # एमईएफ उपयोग स्थिर कक्षाओं

public static A LoadPackage(string filePath) 
    { 
      var catalog = new AggregateCatalog(); 
      catalog.Catalogs.Add(new AssemblyCatalog(filePath)); 
      var _container = new CompositionContainer(catalog); 
      ??? 
    } 

तो वहाँ अब एक तरह से विधानसभा filepath द्वारा निर्दिष्ट से प्रकार आयात करने के लिए है:

[Import(typeof(A))] 
    static private A _a1; 

तो मैं एक तरीका है जिसके मैं विधानसभा एक तर्क के रूप नाम पारित करने के लिए है?

मैं नहीं कर सकते:

_container.ComposeParts(this); 

के बाद से वर्ग `स्थिर है और न तो मैं और क्या कर सकते हैं इस

_container.ComposeParts(_a1); 

के बाद से A नहीं है (पूरी तरह से के साथ शुरू गलत हो सकता है जो) किसी भी कंस्ट्रक्टर्स होती है (इसलिए _a1 रिक्त है)

+1

क्या कोई कारण है कि इसे स्थैतिक होना चाहिए? आप जो कुछ भी आयात/निर्यात डिफ़ॉल्ट रूप से सिंगलटन होंगे, जो ज्यादातर मामलों में स्थैतिक वर्ग होने से बेहतर है। – eandersson

+0

यह उन विकल्पों में से एक है जिन पर मैं विचार कर रहा हूं। इसे स्थैतिक रखने का कारण यह है कि मैं अपने पूरे प्रोजेक्ट में कोड बदलना नहीं चाहता हूं। (यानी - मैं आलसी हूं)) – noaRAVE

+0

मुझे पूरा यकीन है कि आप सीधे एमईएफ के साथ स्थिर कक्षाओं का उपयोग नहीं कर सकते हैं, लेकिन मैं नहीं करता निश्चित रूप से यह नहीं पता है। – eandersson

उत्तर

6

खैर यह पता चला है कि विधि मैं खोज रहा था GetExportedValue है (हाँ, मैं बुनियादी कार्यक्षमता की अनदेखी):

static private A _a1; 

public static A LoadPackage(string filePath) 
{ 
     var catalog = new AggregateCatalog(); 
     catalog.Catalogs.Add(new AssemblyCatalog(filePath)); 
     var _container = new CompositionContainer(catalog); 
     _a1 = _container.GetExportedValue<A>(); 
} 

और मैं अपने क्षेत्र भरा गया (सिर्फ मामले में, मैं पहले से ही यह किसी अन्य वर्ग के लिए चले गए , और यह अब साफ और साफ दिखता है)

+0

कोई अच्छा समाधान नहीं है - जैसा ऊपर उल्लिखित है, साझा किए गए हिस्से के एमईएफ आयात का उपयोग करना बेहतर है और जहां भी संभव हो स्थिर वर्ग/विधियों से बचें। –

11

MEF बना सकते हैं और आप के लिए वस्तुओं को प्रारंभ बनाया गया है। यह स्थैतिक वर्गों में राज्य से निपटता नहीं है।

मेरा सुझाव है कि आप कक्षा और उसके खेतों को गैर स्थैतिक बनाते हैं, और यदि आप सिंगलटन व्यवहार को लागू करना चाहते हैं तो इसे [PartCreationPolicy(CreationPolicy.Shared)] के साथ चिह्नित करें।

एमईएफ और सिंगलटन पैटर्न पर भी this other question देखें।

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