2010-06-24 11 views
8

(so circa le altre domande MEF/MAF, ma questo è un problema più specifico)Applicazione WPF estensibile - MEF, MAF o caricamento semplice?

voglio creare un'applicazione WPF che sarà essenzialmente essere solo un semplice add-in di accoglienza, GUI e le impostazioni. Tutto il lavoro effettivo verrà svolto da uno o più plug-in. Non hanno bisogno di comunicare tra loro, l'applicazione principale invierà comandi/comandi utente a loro e restituiranno alcuni risultati (ad esempio, elementi dell'interfaccia utente WPF per il rendering).

Ora, dal momento che il nucleo dell'applicazione si basa sui plug-in, devo scegliere un buon metodo per gestirli. Voglio essere in grado di caricarli/scaricarli/ricaricarli in fase di esecuzione (ad esempio quando viene trovato e scaricato un aggiornamento). Probabilmente dovrebbero essere eseguiti nel proprio dominio e/o processo di applicazione per garantire stabilità e sicurezza.

Da alcune ricerche e sperimentazioni sono venuto a tre opzioni:

  • System.AddIn (MAF): Sembra che questo può fare tutto quello che serve. C'è una pipeline che consente di eseguire più versioni dell'API contemporaneamente per compatibilità, ecc. Ma a meno che manchi qualcosa devo creare più volte l'API: viste host e plug-in, contratto e due adattatori per il contratto. Inoltre ci sono poche (rispetto al MEF) informazioni e risorse in giro e la maggior parte degli articoli ha pochi anni. Sono preoccupato che questo sta lentamente morendo e preferirei non usarlo per un nuovo progetto.

  • MEF: Questo sembra semplice, ma si sente anche come c'è un sacco di magia che non posso controllare, e gli strati non sono separati come in MAF. Voglio solo una piccola libreria che puoi collegare a un nuovo progetto, implementare l'interfaccia e il plugin è fatto.

  • Caricamento manuale: L'ultima opzione sarebbe quella di cartella di scansione manualmente per dll, l'uso di riflessione per trovare le classi di plugin e creare istanze. Anche se è fattibile, avrei preferito usare un quadro di riferimento di caricare manualmente assemblee, creare processo separato/AppDomain ecc

Quindi, quale sarebbe meglio per questo tipo di applicazione, oppure c'è qualcosa che io' hai perso?

+0

Oggetto molto curato. accoppiare buoni articoli correlati; http://pwlodek.blogspot.com/2011/07/isolating-mef-components.html e http://blogs.msdn.com/b/tilovell/archive/2011/08/19/wf4-hosting-the- workflowdesigner-o-altro-WPF-roba-in-a-parte-AppDomain.aspx – Will

risposta

9

MEF è sicuramente l'opzione più semplice delle tre. È stato progettato in questo preciso scenario (applicazioni estensibili).

In realtà è il meccanismo "plug-in" utilizzato da Visual Studio, che è un'applicazione WPF. Tutto quello che devi fare è avere il tuo "plugin" implementare un'interfaccia o derivare da una classe base nota e aggiungere l'attributo [Export]. A condizione che il suo assembly venga aggiunto al catalogo dell'applicazione principale, quel tipo può essere [Import] edito dall'applicazione principale in un unico passaggio. C'è pochissimo lavoro nel fare questo lavoro.

Sarebbe la mia raccomandazione, a meno che non vi sia una valida ragione per scegliere un'opzione diversa. MAF ha più supporto per l'isolamento, ma è molto più difficile da usare, e la maggior parte delle funzionalità di isolamento non saranno utilizzabili in un'applicazione WPF, poiché l'interfaccia utente in WPF non può in alcun caso essere un codice isolato.

+0

"... poiché l'interfaccia utente in WPF non può essere davvero isolata ..." Non sono sicuro di cosa intendi. Ho bisogno dell'applicazione per restituire un'interfaccia utente, ad esempio un pulsante. Questo sarà reso dall'app principale, ma può essere richiamato al plugin. È possibile far funzionare il plug-in in diversi appdomain per impedirgli di bloccare l'intera applicazione e magari fornire un po 'di isolamento per i plugin a bassa affidabilità? – lacop

+0

@ Iacop: userei MEF per questo. Non è possibile isolare l'interfaccia utente in un AppDomain separato, poiché deve essere utilizzabile dalla shell (era ciò che intendevo io). Se lo stai facendo per l'estensibilità dell'interfaccia utente, l'isolamento AppDomain fornito da MAF è inutilizzabile, poiché un'interfaccia utente esiste sempre nel singolo AppDomain principale (in WPF) e non può attraversare AppDomains. –

+1

Se stai usando MAF per plugin puramente algoritmici, che non hanno il codice UI, è possibile isolare il plug-in in un AppDomain separato - ma con l'estensibilità dell'interfaccia utente, questo non funziona - quindi perdi il singolo vantaggio di MAF - ecco perché direi di andare con MEF (è molto più flessibile, meglio supportato, più facile da usare, ecc ...) –