2010-12-06 12 views
5

के साथ आलसी लोडिंग डीएलएल का मैं एमईएफ के साथ अपना पहला प्रोजेक्ट कर रहा हूं और आलसी लोडिंग का उपयोग करने के तरीके को समझने में गंभीरता से असमर्थ हूं। मेरे कोड है -एमईएफ

public static class MefLoader 
{ 
    private static CompositionContainer Container; 

    [ImportMany(typeof(IControlModule), AllowRecomposition = true)] 
    private static IEnumerable<Lazy<IControlModule, IImportComponentCapabilites>> 
       DllList { get; set; } 

    static MefLoader() 
    { 
     var catalog = new AggregateCatalog(); 
     catalog.Catalogs.Add(new DirectoryCatalog(".")); 
     Container = new CompositionContainer(catalog); 

    } 

मैं, कैसे MEF का उपयोग करने का सबसे समझते हैं, सिवाय इसके कि मैं नहीं देख पा रहे DllList वस्तु को प्रारंभ करने के लिए कैसे। मैं आलसी लोडिंग का उपयोग करना चाहता हूं क्योंकि अंतिम प्रणाली में, हमारे पास बहुत सारे विकल्प हैं और केवल 10% किसी भी समय उपयोग किए जा रहे हैं।

उत्तर

6

सबसे पहले, आप एक स्थिर संपत्ति में वस्तुओं को आयात करने की कोशिश कर रहे हैं। यह एमईएफ द्वारा समर्थित नहीं है: एमईएफ ऑब्जेक्ट्स, कक्षा लिखता है। आप स्थिर गुणों को प्रारंभ करना चाहते हैं, तो आप इस तरह मैन्युअल रूप से इसे क्या करना है:

DllList = container.GetExports<IControlModule, IImportComponentCapabilites>(); 

अब आलसी लोड हो रहा है के बारे में: DirectoryCatalog निर्देशिका में प्रत्येक विधानसभा के लिए एक AssemblyCatalog पैदा करता है। AssemblyCatalog एमईएफ में कार्यान्वयन असेंबली में सभी प्रकारों की गणना करेगा जैसे ही AssemblyCatalog.Parts कहा जाता है, जो तब होता है जब आप कंटेनर से निर्यात खींचते हैं। इसका मतलब यह है कि एमईएफ ने यह निर्धारित करने से पहले असेंबली को लोड किया है कि इसमें एक ऐसा हिस्सा शामिल है जिसे वास्तव में इसकी जरूरत है।

वास्तव में असेंबली के आलसी लोडिंग के लिए, उन विधानसभाओं में कौन से हिस्सों उपलब्ध हैं, इस बारे में जानकारी कहीं और कैश की आवश्यकता होगी। एमईएफ में वर्तमान में इस तरह के एक अंतर्निर्मित कैश तंत्र बॉक्स के बाहर नहीं है। हालांकि, MEF source code at codeplex के साथ शामिल नमूने में ComposablePartCatalogAssemblyCache कार्यान्वयन है।

एकमात्र चीज जो Lazy<T> करता है, उस क्षण को स्थगित कर दिया जाता है जब कन्स्ट्रक्टर भाग कहा जाता है। यह पहले से ही चीजों को तेज कर सकता है लेकिन यह असेंबली के लोडिंग को स्थगित नहीं करेगा।

1

MEF बारे में महान बात (डिफ़ॉल्ट रूप से) आप वस्तु को प्रारंभ नहीं है; एमईएफ किसी भी घोषित [निर्यात] से मेल खाता है जो आपके आयात से मेल खाता है और फिर MEF उन्हें आपके लिए रखता है। यदि आपकी निर्भरताओं पर निर्भरताएं हैं, तो एमईएफ तब तक श्रृंखला जारी रखेगा जब तक कि आपका पूरा ग्राफ हल नहीं हो जाता है।

आलसी (टी के विपरीत) का उपयोग करने का मतलब यह है कि जब तक आप उस निर्भरता तक पहुंच नहीं पाते हैं तो तत्कालता में देरी होगी। यदि, शायद, आप डिबगिंग कर रहे हैं, और जब आप उस निर्भरता को प्रारंभ करते हैं तो आप नहीं देख रहे हैं, तो आपको तत्कालता को दूर करने के लिए मूल्य संपत्ति तक पहुंचने की आवश्यकता होगी।

MEF और अधिकांश अन्य आईओसी कंटेनर (के रूप में MEF सिर्फ तानाना/रचना पर केंद्रित है) के बीच कुछ बड़े मतभेद हैं, लेकिन यह कैसे एक आईओसी कंटेनर, के बाद एक प्रकार दर्ज किया गया है, निर्भरता जब दृष्टांत होगा के समान है आप कुछ हल करते हैं।

क्या आप इन्स्टेन्शियशन व्यवहार के कुछ कैसे बदल सकते हैं के बारे में उत्सुक हैं, तो निर्माण यहां दी गई नीतियों पर कुछ विस्तार से बताया गया है: http://mef.codeplex.com/wikipage?title=Parts%20Lifetime

0

यह वास्तव में एक पुराना सवाल है, लेकिन किसी भी समाधान की तलाश में, मैंने हाल ही में LazyAssemblyCatalog लागू किया है जो प्लगइन असेंबली की आलसी लोडिंग को सक्षम बनाता है जबकि प्लगइन मेटाडेटा को इन असेंबली को लोड किए बिना उपलब्ध कराया जाता है। इसकी अवधारणा CachedAssemblyCatalog के समान ही है जो @Wim ने अपने उत्तर में उल्लेख किया है। मुझे उम्मीद है कि यह किसी के लिए कुछ मदद करेगा।

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