2013-12-08 7 views
6

मैं MEF और मैं उपयोग कर रहा हूँ एक ही अनुबंध प्रकार होने दो निर्यात है, लेकिन अलग-अलग अनुबंध नाम के साथसेवा लोकेटर: Get सभी निर्यात

उदाहरण के लिए:

[Export("TypeA", typeof(MyPlugin))] 
[Export("TypeB", typeof(MyPlugin))] 

मैं प्रत्येक निर्यात का उपयोग कर पुनः प्राप्त कर सकता है अपने संबंधित अनुबंध नाम:

ServiceLocator.GetExportedValues<MyPlugin>("TypeA"); 

लेकिन अब मैं MyPlugin को लागू सभी उदाहरणों को पुनः प्राप्त करना चाहते हैं। क्या मैं ऐसा कर सकता हूं?

मैं निम्नलिखित कोड का उपयोग कर की कोशिश की है:

ServiceLocator.GetExportedValues<MyPlugin>(); 

लेकिन यह काम नहीं किया। स्पष्ट रूप से इसका उपयोग केवल विशिष्ट अनुबंध नाम के साथ केवल कार्यान्वयन को पुनर्प्राप्त करने के लिए किया जाता है।

कोई राय?

उत्तर

4

आगे जानकारी प्राप्त कर सकते मैं बस हर नामित निर्यात के साथ-साथ एक अनाम निर्यात जोड़ना होगा अगर आप इसे ढूढने दोनों तरीकों से होना चाहता हूँ। उदाहरण के लिए

// named and nameless 
[Export("TypeA", typeof(MyPlugin))] 
[Export(typeof(MyPlugin))] 

// named nameless, again 
[Export("TypeB", typeof(MyPlugin))] 
[Export(typeof(MyPlugin))] 

class MyPlugin { } 


[TestMethod] 
public void mef() 
{ 
    var catalog = new AssemblyCatalog(this.GetType().Assembly); 
    var container = new CompositionContainer(catalog); 

    Assert.AreEqual(2, container.GetExportedValues<MyPlugin>().Count()); 
} 
0

आप दृढ़ता से टाइप किए गए मेटाडाटा निर्यात का उपयोग कर सकते हैं।

  1. निर्यात एट्रिब्यूट से विरासत में प्राप्त एक कस्टम विशेषता बनाएं, जो इंटरफ़ेस से लागू होती है।
  2. निर्यात के बजाय इस कस्टम विशेषता का उपयोग करें।

आप आवश्यक प्रकार प्राप्त करने के लिए आयात का उपयोग कर सकते हैं।

[ImportMany] 
public IEnumerable<Lazy<YourType,IMetadataAttribute>> Plugins{get;private set;} 

आप से MEF Documentation

0

Export

[Export(typeof(IFoo)),Export("TypeA", typeof(IFoo))] 
public class Foo1 : IFoo { } 

[Export(typeof(IFoo)),Export("TypeB", typeof(IFoo))] 
public class Foo2 : IFoo { } 

के दोनों प्रकार के घोषित करने और ImportMany

[ImportMany] 
IFoo[] foos; 
+1

का उपयोग कर यह कैसे @ default.kramer की तुलना में किसी भी अलग अलग जवाब देने के है उन्हें आयात? –

+0

घोषणा एक जैसी है, फिर भी मैं आपको यह भी दिखाता हूं कि आप मेफ़ को कंटेनर/कैटलॉग को सीधे संदर्भित किए बिना सभी उदाहरणों को कैसे इंजेक्ट कर सकते हैं ... यह एक उचित तरीका है कि किसी को डीआई फ्रेमवर्क का उपयोग कैसे करना चाहिए। –

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