2010-05-31 17 views
8

मैं MEF उपयोग करने के लिए शुरू कर रहा हूँ, और मैं इस तरह, कई निर्माताओं के साथ एक वर्ग है:MEF निर्माता पैरामीटर

[Export(typeof(ifoo))] 
class foo : ifoo { 
    void foo() { ... } 
    [ImportingConstructor] 
    void foo(object par1) { ... } 
} 

मैं catalog.ComposeExportedValue() उपयोग कर रहा हूँ जब par1 मूल्य से पीछे नहीं की आपूर्ति के लिए रचना निर्माता:

... 
catalog.ComposeExportedValue(par1Value); 
catalog.ComposeParts(this); 
... 

घटकों पकड़ करने के लिए मैं उपयोग कर रहा हूँ:

[ImportMany(typeof(ifoo))] 
public List<Lazy<ifoo, ifoometadata>> FooList { get; set; } 

और foo उदाहरण बनाने के लिए मैं मान संपत्ति का उपयोग कर रहा हूं, FooList[0].Value

सबकुछ ठीक काम करता है, सिवाय इसके कि foo कक्षा का दूसरा कन्स्ट्रक्टर कभी नहीं कहा जाता है। क्या गलत है?

जब मैं एमईएफ कक्षा को तत्काल करता हूं तो मैं उस कंस्ट्रक्टर का चयन कैसे करूं जिसका उपयोग करना चाहता हूं?

+0

पर http://stackoverflow.com/questions/2008133/mef-constructor-injection ... यह एक नज़र: यहाँ एक परीक्षण है जो एक वर्ग भी एक डिफ़ॉल्ट निर्माता है पर एक ImportingConstructor का उपयोग कर से पता चलता है * बिल्कुल * एक ही सवाल नहीं है, लेकिन स्वीकृत उत्तर रचनाकारों को आयात करने पर कुछ प्रकाश डालता है जो मदद कर सकता है। –

+0

हां, असल में मैं डैनियल प्लास्ट से जवाब का उपयोग कर रहा हूं, समस्या यह है कि मैं कई कन्स्ट्रक्टर परिभाषाओं का उपयोग करके mef इंस्टेंस सृजन के किसी भी उदाहरण को नहीं ढूंढ सकता। – InterWAS

उत्तर

8

MEF उस निर्माता का उपयोग करना चाहिए जिसे आपने ImportingConstructorAttribute पर रखा है। मुझे यकीन नहीं है कि आपके लिए क्या हो रहा है, मैं इस मुद्दे को पुन: उत्पन्न करने में सक्षम नहीं था।

[TestClass] 
public class MefTest 
{ 
    public const string ConstructorParameterContract = "FooConstructorParameterContract"; 

    [TestMethod] 
    public void TestConstructorInjectionWithMultipleConstructors() 
    { 
     string ExpectedConstructorParameterValue = "42"; 

     var catalog = new TypeCatalog(typeof(Foo), typeof(FooImporter)); 
     var container = new CompositionContainer(catalog); 

     container.ComposeExportedValue<string>(ConstructorParameterContract, ExpectedConstructorParameterValue); 

     var fooImporter = container.GetExportedValue<FooImporter>(); 

     Assert.AreEqual(1, fooImporter.FooList.Count, "Expect a single IFoo import in the list"); 
     Assert.AreEqual(ExpectedConstructorParameterValue, fooImporter.FooList[0].Value.ConstructorParameter, "Expected foo's ConstructorParameter to have the correct value."); 
    } 
} 

public interface IFoo 
{ 
    string ConstructorParameter { get; } 
} 

[Export(typeof(IFoo))] 
public class Foo : IFoo 
{ 
    public Foo() 
    { 
     ConstructorParameter = null; 
    } 

    [ImportingConstructor] 
    public Foo([Import(MefTest.ConstructorParameterContract)]string constructorParameter) 
    { 
     this.ConstructorParameter = constructorParameter; 
    } 


    public string ConstructorParameter { get; private set; } 
} 

[Export] 
public class FooImporter 
{ 
    [ImportMany] 
    public List<Lazy<IFoo>> FooList { get; set; } 
} 
+0

धन्यवाद डैनियल, यह इस तरह से काम कर रहा है, लेकिन अब मैं एक और समस्या पर फंस गया: एमईएफ कन्स्ट्रक्टर आयात व्युत्पन्न कक्षाओं का उपयोग करते समय काम नहीं करता है, जैसे कि हमारे पास Foo2 क्लास है जो आपके उदाहरण में फू से विरासत में है और बाकी को निर्यात करने के लिए बदलती है/फू से सभी व्युत्पन्न वर्ग आयात करें, बेस क्लास (फू) के पैरामीटर के साथ निर्माता को बुलाया नहीं जाता है। शायद यह डिजाइन द्वारा, सभी आधार वर्गों के रचनाकारों को सभी तरह से जांचने के लिए नहीं। लेकिन मैं बेस क्लास (फू) में फ़ील्ड आयात का उपयोग कर रहा हूं और यह काम करता है, इसलिए कम से कम अभी तक कन्स्ट्रक्टर आयात के बजाय इस वर्कराउंड का उपयोग कर रहा हूं। आपकी मदद डैनियल के लिए धन्यवाद। – InterWAS

+0

@InterWAS यह डिज़ाइन द्वारा है। इस तरह .NET कार्य में कन्स्ट्रक्टर- जब आप ऑब्जेक्ट बनाते हैं तो आप बिल्कुल एक कन्स्ट्रक्टर को कॉल करते हैं और यह बेस क्लास कन्स्ट्रक्टर नहीं हो सकता है। एक व्युत्पन्न वर्ग अपने कन्स्ट्रक्टर में बेस क्लास के कन्स्ट्रक्टर को कॉल कर सकता है। संपत्ति/क्षेत्र के आयात शायद आपके मामले में अधिक समझ में आते हैं। –

3

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

+0

नहीं, composeExportedValue() में मैं उन मानों को पास करता हूं जिन्हें मैं रचनाकारों में इंजेक्ट करना चाहता हूं: कैटलॉग। कॉम्प्लेक्स एक्सपोर्टेड वैल्यू (par1Value); मेरी समस्या यह है कि किसी भी सुव्यवस्थित कन्स्ट्रक्टर पैरामीटर को केवल अनदेखा किया जाता है और क्लास फू को केवल पहले कन्स्ट्रक्टर का उपयोग करके तत्काल किया जाता है। – InterWAS

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