2012-09-10 15 views
5

अपडेट: क्या मुझे इसे डी कंटेनर द्वारा संभालने का प्रयास करना चाहिए या यह गलत गलतकरण स्तर है?एमईएफ और एबस्ट्रैक्ट फैक्टरी

मैं MEF (.NET 4.5) का उपयोग करके ABSTRACT फैक्ट्री को कार्यान्वित करना चाहता हूं।

यह मेरे लिए काम नहीं करता है ...

रचना अपरिवर्तित रहता है। निम्नलिखित त्रुटिओं के कारण परिवर्तन अस्वीकार कर दिए गए:

संरचना ने एक एकल संरचना त्रुटि उत्पन्न की। मूल कारण नीचे प्रदान किया गया है। अधिक विस्तृत जानकारी के लिए CompositionException.Errors प्रॉपर्टी की समीक्षा करें।

1) कोई निर्यात पाए गए कि बाधा से मेल खाते हैं:

ContractName Mef3.Factory

RequiredTypeIdentity Mef3.Factory में परिणामी: सेट नहीं कर सकता आयात 'Mef3.Program._factory (ContractName = "Mef3। कारखाना ") 'भाग' Mef3.Program 'पर।

तत्व: Mef3.Program._factory (ContractName = "Mef3.Factory") -> Mef3.Program

यह MEF में यह करने के लिए सही तरीका है? मैं आईडी को फू/बार सीटीर्स कैसे भेज सकता हूं?

कोड:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var program = new Program(); 
     program.Run(); 
    } 

    readonly CompositionContainer _container; 

    public Program() 
    { 
     var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()); 
     _container = new CompositionContainer(catalog); 
     _container.ComposeParts(this); 
    } 

    [Import] 
    public Factory _factory; 

    public void Run() 
    { 
     var foo = _factory.GetInstance("foo", 123); 
     Console.WriteLine(foo is Foo); 
    } 
} 

[Export] 
public class Factory 
{ 
    private readonly ExportFactory<Foo> _fooFactory; 
    private readonly ExportFactory<Bar> _barFactory; 

    [ImportingConstructor] 
    public Factory(ExportFactory<Foo> fooFactory, ExportFactory<Bar> barFactory) 
    { 
     _fooFactory = fooFactory; 
     _barFactory = barFactory; 
    } 

    public Base GetInstance(string name, int id) 
    { 
     switch (name) 
     { 
      case "foo": 
       return _fooFactory.CreateExport().Value; 

      case "bar": 
       return _barFactory.CreateExport().Value; 
     } 

     throw new ArgumentException(); 
    } 
} 

public class Foo : Base 
{ 
    [ImportingConstructor] 
    public Foo([Import("Id")] int id) 
    { 
    } 
} 

public class Bar : Base 
{ 
    [ImportingConstructor] 
    public Bar([Import("Id")] int id) 
    { 
    } 
} 

[InheritedExport] 
public abstract class Base 
{ 
} 

उत्तर

1

मुद्दा करके अपने [आयात ("आईडी")] फू और बार पर कारण हो लग रहा है। "आईडी" के अनुबंध नाम के साथ कोई निर्यात नहीं है। सामान्य रूप से एमईएफ आपको रनटाइम पर आयात में प्रवेश करने की अनुमति नहीं देता है, आपको रचना समय पर पूरे ग्राफ को संतुष्ट करने में सक्षम होना चाहिए या नहीं, यह काम नहीं करेगा। यदि आप इस विशेष परिदृश्य को पूरा करने के लिए एमईएफ का उपयोग करना चाहते हैं तो आपको फू और बार पर आयातक कॉन्स्ट्रक्टर को हटा देना चाहिए और बेस क्लास पर एक सेटआईडी विधि जोड़ना चाहिए और जब आप GetInstance को कॉल करते हैं तो अपने फैक्ट्री को कॉल करें।

+0

धन्यवाद। मैंने फू/बार सीटीआर पैरामीटर हटा दिए। यह एक ही अपवाद फेंकता है। –

+0

आईडी के लिए संपत्ति इंजेक्शन का उपयोग करना अजीब लगता है क्योंकि यह वैकल्पिक नहीं है। क्या आपको लगता है कि ऐसा परिदृश्य DI पैटर्न को सूट नहीं करता है? क्या यह केवल एमईएफ समस्या है? क्या मुझे अन्य डी कंटेनर का उपयोग करना चाहिए या यह डीआई के लिए सिर्फ एक गलत अमूर्त स्तर है? –

+0

क्या कोई इस कोड स्निपेट को आजमाता है? क्या मैं अकेला व्यक्ति हूं जिसके लिए यह अपवाद फेंकता है? –

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