2016-08-31 8 views
5

मैं नमूना PRISM एप्लिकेशन पर काम कर रहा हूं और मैं अपने सभी निर्यात बनाने के लिए एमईएफ RegistrationBuilder का उपयोग करना चाहता हूं। , ModuleExportAttribute उदाहरण के लिएक्या PRISM मॉड्यूल एक्सपोर्ट बनाने के लिए एमईएफ पंजीकरणबिल्डर का उपयोग करना संभव है?

[Export(typeof(IFooService))] 
public class FooService : IFooService { ... } 

Builder.ForTypesMatching(typeof(IFooService).IsAssignableFrom(type)).Export<IFooService>(); 

हालांकि, मॉड्यूल एक अलग विशेषता का उपयोग,:

[ModuleExport(typeof(ModuleA), DependsOnModuleNames = new string[] { "ModuleB" })] 
public sealed class ModuleA : IModule { ... } 

मैं कैसे RegistrationBuilder वर्ग का उपयोग करने के यकीन नहीं है ExportAttribute का उपयोग कर के बराबर इस प्रकार है ModuleExportAttribute का उपयोग करने के बजाय मॉड्यूल निर्यात बनाएं। क्या यह भी संभव है क्योंकि इसे मानक निर्यात से अलग निर्यात किया जाता है?

उत्तर

1

The ModuleExport attribute अनिवार्य रूप से केवल Export(typeof(IModule)) टाइप-सुरक्षित मेटाडाटा (IModuleExport) के साथ अटूटबूट है। आप इस मेटाडेटा को स्वयं जोड़कर RegistrationBuilder के साथ अपने व्यवहार को आसानी से "कॉपी" कर सकते हैं।

[ImportMany] 
Lazy<IModule, IModuleExport>[] Modules { get; set; } 

आप ध्यान रखें कि आप मेटाडाटा में सभी उल्लेख करना होगा: उदाहरण

RegistrationBuilder builder = new RegistrationBuilder(); 
builder.ForType<ModuleA>().Export<IModule>(eb => eb 
    .AddMetadata("DependsOnModuleNames", new string[] { "ModuleB" }) 
    .AddMetadata("InitializationMode", InitializationMode.WhenAvailable) 
    .AddMetadata("ModuleName", "ModuleA") 
    .AddMetadata("ModuleType", typeof(ModuleA))); 

के लिए आप इस, इसलिए की तरह अपने मॉड्यूल आयात करने जो मूल रूप से है प्रिज्म पर्दे के पीछे क्या करता है के द्वारा काम करता है की पुष्टि कर सकतेIModuleExport इंटरफ़ेस में गुण, या मॉड्यूल आयात नहीं किया जाएगा (के रूप में वे IModuleExport इंटरफेस को संतुष्ट नहीं करते)


जवाब को जोड़ना:

कोड ऊपर सही, काम कर रास्ता है; नीचे दिया गया कोड सही दिखता है, लेकिन काम नहीं करता है।

यह ध्यान रखना महत्वपूर्ण है कि यह केवल तभी काम करता है जब आप PartBuilder.Export(Action<ExportBuilder> exportConfiguration) अधिभार का उपयोग करते हैं।

RegistrationBuilder builder = new RegistrationBuilder(); 
builder.ForType<ModuleA>().Export<IModule>() 
    .AddMetadata("DependsOnModuleNames", new string[] { "ModuleB" }) 
    .AddMetadata("InitializationMode", InitializationMode.WhenAvailable) 
    .AddMetadata("ModuleName", "ModuleA") 
    .AddMetadata("ModuleType", typeof(ModuleA)); 
+0

कोड सुझाए गए कोड; यह ध्यान रखना महत्वपूर्ण है कि आपको सही 'निर्यात()' अधिभार का उपयोग करना होगा। इसके अतिरिक्त, सभी मेटाडाटा को जोड़ने के लिए जरूरी नहीं है, केवल वही हिस्सों जो आपको चाहिए, बाकी के पास एक डिफ़ॉल्ट मान होगा, जो ठीक है अगर आप 'प्रारंभिक मोड' या निर्भरताओं जैसी चीजें निर्दिष्ट नहीं करना चाहते हैं। धन्यवाद! –

+0

जब मैंने इसे चेक किया, तो मैं उन मॉड्यूल को लोड करने में सक्षम नहीं था जिनके पास केवल 'DependsOnModuleNames' मेटाडेटा था इसलिए मैंने माना कि सभी मेटाडेटा को जोड़ना आवश्यक है। शायद कुछ गुणों की आवश्यकता है और कुछ वैकल्पिक हैं, लेकिन मुझे यकीन नहीं है कि कोई कैसे जानता है कि कौन सा है। –

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

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