La mia applicazione comprende alcuni gruppi principali e diversi gruppi di estensioni/plugin. Affinché MEF possa conoscere tutte le parti che i plug-in hanno da offrire, devo caricare questi assembly anche se non userò mai nessuna delle loro parti. Ciò rende l'applicazione impiegare più tempo per l'avvio (se ho intenzione di caricare tutti gli assembly all'avvio) e aumenta anche l'ingombro della memoria.Caricamento lento di assiemi/cataloghi
Idealmente, non avrò bisogno di caricare gli assiemi finché non ne avrò effettivamente bisogno. Carico solo i dati di esportazione dei plug-in e, quando effettivamente devo importare una parte, MEF carica il gruppo e fornisce la parte.
Ho scoperto che c'è qualcosa che fa praticamente tutto quello che ho appena scritto, ma dopo averlo chiesto in MEF CachedAssemblyCatalog - Lazy Loading of Assemblies, ho capito che questo codice non è considerato stabile e non viene gestito dal team MEF, quindi ho deciso di non usarlo.
mia domanda è come allora posso ottenere questo comportamento:
- Essere in grado di accedere ai metadati di esportazione assemblee plugin senza caricare tutto il loro assemblaggio.
- Integrazione trasparente con il codice che importa le parti; utilizzare le importazioni come di consueto - qualcun altro (un catalogo specializzato?) si occuperà di caricare gli assemblaggi se necessario e di fornire la parte richiesta.
- Non perdere alcuna funzionalità MEF esistenti, come ricomposizione, tipi pigri, ecc
Io sono completamente bene con una soluzione che richiede l'analisi dei plug-in anticipo per creare un assembly di metadati, file XML o roba del genere.
Hey Petrik, grazie mille per il vostro aiuto! Mi sono imbattuto nella domanda che hai collegato qualche tempo fa e mi ha aiutato molto a risolvere questo problema. Quello che ho finito per fare era qualcosa di simile a quello che hai descritto lì: ho serializzato i dati su un file e creato un nuovo catalogo che consuma quel file. In questo modo, tutte le esportazioni, compresi i metadati, sono disponibili e utilizzando l'API 'ReflectionModelServices', tutto è stato caricato pigramente. Questo sembra il modo migliore per soddisfare le mie esigenze. Spero di avere un po 'di tempo per rispondere a questa domanda da solo con quello che ho fatto. Grazie ancora! –