2011-08-04 7 views
12

मैं अपने ऐप में प्लगइन लोड करने के लिए एमईएफ का उपयोग कर रहा हूं। सबकुछ काम करता है, लेकिन जब मैं अपने ऐप फ़ोल्डर में गिरा दिया जाता हूं तो मैं नए हिस्सों को खोजना चाहता हूं। क्या यह संभव है? DirectoryCatalog में एक बदली हुई घटना है लेकिन मुझे यकीन नहीं है कि यह कैसे काम करता है।एप्लिकेशन चल रहा है, जबकि नए MEF भागों को कैसे खोजें?

यह मेरा कोड अभी है:

public sealed class RevealerFactory 
{ 
    private static readonly Lazy<RevealerFactory> lazy = 
      new Lazy<RevealerFactory>(() => new RevealerFactory()); 

    public static RevealerFactory Instance { get { return lazy.Value; } } 

    private FileSystemWatcher watcher; 

    private RevealerFactory() 
    { 
     Initialize(); 
    } 

    [ImportMany(RequiredCreationPolicy = CreationPolicy.Shared)] 
    private IEnumerable<Lazy<IRevealer, IRevealerCapabilities>> Revealers { 
     get; 
     set; 
    } 

    public IRevealer GetRevealer(Uri uri) 
    { 
     return (from revealer in Revealers 
       where uri.Host.Equals(revealer.Metadata.Host, 
             StringComparison.OrdinalIgnoreCase) 
        && revealer.Value.IsRevelable(uri) 
       select revealer.Value).FirstOrDefault(); 
    } 

    private void Initialize() 
    { 
     var catalog = new DirectoryCatalog(
      Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) 
             + "/SDownloader/Revealers"); 
     var container = new CompositionContainer(catalog); 
     container.ComposeParts(this); 
    } 
} 

उत्तर

21

आप पता लगाने के लिए नई DLLs अपने प्लगइन फ़ोल्डर में कट जा रहें FileSystemWatcher उपयोग कर सकते हैं। फिर आप नए हिस्सों के साथ एमईएफ संरचना को अद्यतन करने के लिए DirectoryCatalog.Refresh या AggregateCatalog.Catalogs.Add पर कॉल करके ऐसी घटनाओं को संभाल सकते हैं।

कुछ बातें पता होनी चाहिए:

  1. आप के रूप Recomposition पर MEF प्रोग्रामिंग गाइड अनुभाग में बताया गया है, recomposition से निपटने के लिए तैयार किया जा रहा के रूप में अपने MEF आयात चिह्नित करने के लिए की जरूरत है। अन्यथा जब आप उन्हें अपडेट करने का प्रयास करते हैं तो MEF एक त्रुटि उठाएगा।

  2. FileSystemWatcher सिस्टम थ्रेड पूल थ्रेड पर ईवेंट बढ़ाता है (जब तक आप SynchronizingObject संपत्ति का उपयोग नहीं करते)। ध्यान रखें कि यदि आप किसी अन्य थ्रेड से DirectoryCatalog.Refresh पर कॉल करते हैं, तो आपको सक्षम के साथ CompositionContainer बनाना होगा। आपको अपने प्रॉपर्टी सेटर्स की थ्रेड सुरक्षा के बारे में भी सोचना होगा जिसे रचना अद्यतन होने पर बुलाया जाएगा।

  3. आप संग्रह से बाहर निकालकर कैटलॉग भी हटा सकते हैं। लेकिन संबंधित असेंबली को उतारने का कोई तरीका नहीं है (पूरे Appdomain को उतारकर छोड़कर)। इसका मतलब यह भी है कि एप्लिकेशन चालू होने पर भी आप असेंबली को हटा या ओवरराइट नहीं कर सकते हैं।

+3

अलावा आप कैसे छाया नकल सक्षम करने के लिए अपने विधानसभाओं – tartakynov

+0

@tartakynov के गर्म स्वैप अनुमति देने के लिए छाया प्रतिलिपि बनाने सक्षम करने के लिए विचार कर सकते हैं? – zionpi

+0

@zionpi इस विषय को देखें http://stackoverflow.com/questions/4595304/change-dll-loaded-with-mef – tartakynov

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