2010-07-25 8 views
5

La mia applicazione dovrebbe essere estensibile. Per i miei bisogni ho implementato alcuni servizi. Questi servizi sono basati sul principio di IoC/DI. Quindi i servizi incapsulano il concetto dell'applicazione.Best practice per l'implementazione di una strategia addin/addon/plug-in

Per esempio, esiste un servizio IApplication. ApplicationService espone le informazioni sull'esecuzione corrente dell'applicazione. Sono specificati AssemblyInfo e così via. Un altro esempio è l'INavigationService (vedi mef.codeplexcom negli esempi). Questo servizio fornisce alcune proprietà in cui sono riportate informazioni sull'elemento selezionato corrente e anche alcuni eventi.

Penso che "l'approccio al servizio" sia il più semplice e semplifica i punti di estensione per l'applicazione. Quindi, non sono sicuro che questo sia davvero l'approccio migliore. Cosa ne pensi? Come implementeresti "punti di estensione" in un'applicazione come addin/addon/plugin ...?

Grazie in anticipo per le vostre risposte! E scusa, il mio inglese è povero. ;)

risposta

4

Hai familiarità con MEF (Managed Extensibility Framework)?

Il Managed Extensibility Framework (o MEF in breve) semplifica la creazione di applicazioni estendibili. MEF offre funzionalità di scoperta e composizione che è possibile sfruttare per caricare le estensioni dell'applicazione.

0

Sì, ho familiarità con MEF. Uso anche il concetto di MEF, ma ci sono alcuni svantaggi. La mia applicazione è simile a IoC/DI e, insieme a MEF, è un po 'complicata. Il MEF non è realmente un contenitore DI, quindi è difficile impiantare MEF con un altro contenitore DI (ad esempio, ninject, unity, ...). Non userò MEF con altri contenitori DI. Quindi mescolare MEF con altri contenitori DI non è molto buono.

Spero che tu possa capire la mia preoccupazione.

Aggiunta: non è possibile caricare estensioni in un AppDomain in MEF. Quindi questo è per i miei bisogni, non va bene. System.AddIn o MAF supporta questo, ma non userò System.AddIn, perché questo è molto pesante ....

+2

Se si desidera aggiungere informazioni, si prega di ** aggiornare ** il tuo post originale modificandolo - non aggiungere la tua risposta - rende più difficile da seguire ... –

+0

Sì, MEF è ** non ** a Contenitore DI: poiché il suo lavoro è diverso da un contenitore DI. Ma non sono d'accordo: mescolare MEF e un contenitore DI (come StructureMap o Unity) non è così difficile e può essere fatto abbastanza bene. Potrebbe essere necessario spiegare in modo più dettagliato il motivo per cui non pensi che funzioni per oyu ..... –

+0

Gestire il caricamento in un AppDomain non è banale e non penso che la maggior parte dei framework DI gestirà questo. Tutti i tuoi servizi dovranno essere inoltrati per attraversare il confine di AppDomain, il che significa anche che tutte le classi che passano avanti e indietro devono essere MarshalByRef o Serializable.Potresti considerare di avere una categoria di estensioni "attendibili" (senza il marshalling) e un'altra categoria di estensioni "non attendibili" che possono accedere solo a un numero limitato di servizi di marshalling. –