2012-06-25 14 views
6

मैं एमईएफ का उपयोग कर रहा हूं ताकि उपयोगकर्ता मेरी सी # लाइब्रेरी का विस्तार कर सकें। यह अब तक बहुत अच्छा काम कर रहा है, लेकिन अभी मैं इसे इस तरह इस्तेमाल करने की कोशिश कर रहा हूं जिस तरह से मैंने इसे पहले इस्तेमाल नहीं किया है।प्लगइन को मौजूदा कार्यक्षमता को ओवरराइड करने की अनुमति देने के लिए MEF का उपयोग कैसे करें?

MEF के लिए प्राथमिक उपयोग के मामले मैं अब तक देखा है यह है:

  • आवेदन आदिम इंटरफेस (IPerson)
  • बाहरी पुस्तकालय MEF और आदिम इंटरफेस का उपयोग करता है मुख्य पुस्तकालय की कार्यक्षमता बढ़ाने के लिए उजागर करता है (उदाहरण के लिए IPoliceman : IPerson कहते हैं, कार्यक्षमता)
  • आवेदन तो यह क्या करना चाहिए
के आधार पर सही IPerson के लिए खोज करने के लिए ImportMany का उपयोग करता है

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

तो मूल रूप से, मेरा प्रश्न इस पर उबाल जाता है: आम तौर पर एमईएफ कक्षाओं और विधियों के कार्यान्वयन को जोड़ता है। उपयोगकर्ताओं को को कार्यान्वित करने की अनुमति देने के लिए मैं इसका उपयोग कैसे करूं?

+1

यह बहुत आसान लगता है। बस एक प्लगइन को लोड करने की अनुमति दें, और यदि कोई भी उपलब्ध नहीं है तो डिफ़ॉल्ट कार्यान्वयन का उपयोग करें। फिर आप उपयोगकर्ता को अपनी कॉन्फ़िगरेशन में चुन सकते हैं। – eandersson

उत्तर

3

आप किस बारे में बात कर रहे हैं वास्तव में एक ही समस्या को देखने का एक अलग तरीका है। उत्तर यह लगता है कि यह आसान है - किसी भी व्यवहार के लिए जिसे आप क्लाइंट ओवरराइड करने में सक्षम होना चाहते हैं, बस उस व्यवहार को प्लगइन में रखें।

ऐसा कुछ भी नहीं है जो कहता है कि आप प्लगइन्स नहीं लिख सकते हैं क्योंकि आप एप्लिकेशन के लेखक हैं। अपनी टैक्स कैलक्यूलेटर कक्षा को प्लगइन में रखें, और एक इंटरफ़ेस का पर्दाफाश करें जो उपयोगकर्ताओं को अपने कर कैलकुलेटर लिखने की अनुमति देता है। रनटाइम पर, यदि आपके पास एक से अधिक लोड हैं, तो उस व्यक्ति का पक्ष लें जो आपका नहीं है। आउट ऑफ़ द बॉक्स, आप अपने टैक्स कैलकुलेटर प्लगइन का उपयोग करेंगे, इसलिए यह आपके द्वारा अपेक्षित तरीके से काम करेगा। यदि उपयोगकर्ता अपनी कर कैलकुलेटर प्लगइन बनाता है और इसे सही निर्देशिका में छोड़ देता है, तो आप इसके बजाय इसका उपयोग करते हैं, जिससे प्रभावी रूप से उन्हें आपकी मूल कार्यक्षमता "ओवरराइड" करने की अनुमति मिलती है।

+0

समझ में आता है, धन्यवाद! क्या होता है यदि दो प्लगइन्स लोड होते हैं जो उसी कार्यान्वयन को ओवरराइड करने का प्रयास करते हैं। क्या मुझे बस प्रत्येक प्लगइन को एक दूसरे के परिवर्तनों को ओवरराइट करने देना चाहिए, या मुझे अपवाद फेंकना चाहिए। और अगर मैं अपवाद फेंकता हूं, तो मैं पहली जगह में संघर्ष का पता कैसे लगा सकता हूं? –

+0

आप इसे कैसे संभालना चाहते हैं अपने व्यापार के मामले पर निर्भर करता है। कभी-कभी अपवाद एक अच्छा विचार है, कभी-कभी आप केवल एक चुनना चाहते हैं। जब आप असेंबली लोड करते हैं तो आप संघर्ष का पता लगा सकते हैं। यदि कई असेंबली हैं जो आपके आईटीएक्स कोलेक्टर इंटरफेस को निर्यात करते हैं (यहां तक ​​कि सूची से अपना हटाने के बाद भी), आपको पता है कि एक संघर्ष है। –

+0

ठीक है, धन्यवाद। मुझे अपवाद बनाम एक चुनने के बारे में कुछ सोचना होगा। सहायता के लिए धन्यवाद! –

1

मुझे यकीन नहीं है कि कितना समझने जा रहा है, लेकिन मुझे कोशिश करने दो।

मैं TaxCalculatorManager कक्षा बनाउंगा। वह वर्ग एमईएफ से सभी ITaxCalculator कार्यान्वयन लोड कर सकता है। वहां से, आपके पास Export विशेषता में कुछ हो सकता है जो कार्यान्वयन की रैंकिंग की अनुमति देगा। फिर जब आपको करों की गणना करने की आवश्यकता होती है, तो आप TaxCalculatorManager.Calculate पर कॉल करेंगे जो ITaxCalculator कार्यान्वयन को रैंक करेगा और विजेता पर Calculate पर कॉल करेगा।

मुझे बताएं कि आपको किसी भी बिंदु को स्पष्ट करने के लिए मुझे क्या चाहिए।

+0

फ़ूजी द्वारा नोट किया गया है, यदि एकाधिक कार्यान्वयन मौजूद हैं, तो आप उपयोगकर्ता को विजेता चुनने की अनुमति दे सकते हैं। – cadrell0

+0

आपकी प्रतिक्रिया के लिए धन्यवाद। मुझे महत्व पर रैंकिंग कार्यान्वयन के विचार पसंद हैं ... मैं इसे देख लूंगा। –

11

आम तौर पर जब आप किसी निर्यात को ओवरराइड करने का प्रयास करते हैं जो पहले से ही एप्लिकेशन में मौजूद है, तो आपको [Import(typeof(IFoo)] के लिए कार्डिनालिटी अपवाद मिलेगा क्योंकि एमईएफ उम्मीद करता है कि वास्तव में एक मिलान निर्यात उपलब्ध होगा।

हालांकि, आप अपने प्लगइन को एक अलग निर्यात प्रदाता में डाल सकते हैं और इसे प्राथमिकता दे सकते हैं।यहाँ मैं ऐसा आवेदन फ़ोल्डर के अंदर एक "प्लग इन" उप-फ़ोल्डर:

Assembly executingAssembly = Assembly.GetExecutingAssembly(); 
string exeLocation = Path.GetDirectoryName(executingAssembly.Location); 
string pluginPath = Path.Combine(exeLocation, "plugins"); 

var pluginCatalog = new DirectoryCatalog(pluginPath); 
var pluginExportProvider = new CatalogExportProvider(pluginCatalog); 

var appCatalog = new DirectoryCatalog(exeLocation,"*"); 
var appExportProvider = new CatalogExportProvider(appCatalog); 

var container = new CompositionContainer(
    pluginExportProvider, appExportProvider); 

pluginExportProvider.SourceProvider = container; 
appExportProvider.SourceProvider = container; 

निर्यात प्रदाताओं के रूप में रचना कंटेनर के लिए पारित के आदेश प्राथमिकता निर्धारित करता है: एक निर्यात दोनों प्लग इन और आवेदन के द्वारा प्रदान की जाती है, तो भागों, तो प्लगइन्स प्राथमिकता मिलेगा।

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

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