2009-12-28 14 views
7

Possiedo un'applicazione desktop Winforms che carica più parti MEF con lo stesso tipo di interfaccia.Impossibile caricare più parti MEF

Problema: Quando provo a caricare più di uno stesso tipo ottengo la seguente eccezione:

La composizione rimane invariata. Le modifiche sono state rifiutate a causa dei seguenti errori: La composizione ha prodotto un singolo errore di composizione. La causa principale è fornita di seguito. Rivedere la proprietà CompositionException.Errors per informazioni più dettagliate.

1) Non ci sono esportazioni validi sono stati trovati che corrispondono il vincolo '((exportDefinition.ContractName = "BOCA.TaskPilot.Common.Extensions.IFolderViewExtension") & & (exportDefinition.Metadata.ContainsKey ("ExportTypeIdentity") & & " BOCA.TaskPilot.Common.Extensions.IFolderViewExtension ".Equals (exportDefinition.Metadata.get_Item (" ExportTypeIdentity "))))", le esportazioni non valide potrebbero essere state respinte.

Con conseguente: non è possibile impostare l'importazione 'TaskPilot.Windows.MainForm.FolderViewExtension (ContractName = "BOCA.TaskPilot.Common.Extensions.IFolderViewExtension")' da parte 'TaskPilot.Windows.MainForm'. Elemento: TaskPilot.Windows.MainForm.FolderViewExtension (ContractName = "BOCA.TaskPilot.Common.Extensions.IFolderViewExtension") -> TaskPilot.Windows.MainForm

Ecco il codice per caricare le parti:

  AggregateCatalog catalog = new AggregateCatalog(); 
     catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly())); 
     //string myExecName = Assembly.GetExecutingAssembly().Location; 
     //string myPath = Path.GetDirectoryName(myExecName); 
     catalog.Catalogs.Add(new DirectoryCatalog(@"C:\Data\TaskPilot\Development\Source\BOCA.TaskPilot.FolderView\bin\Debug")); 
     catalog.Catalogs.Add(new DirectoryCatalog(@"C:\Data\TaskPilot\Development\Source\BOCA.TaskPilot.TaskView\bin\Debug")); 
     // Uncomment below line and it works without exceptions raised 
     //catalog.Catalogs.Add(new DirectoryCatalog(@"C:\Data\TaskPilot\Development\Source\BOCA.FileManager\bin\Debug")); 

     var container = new CompositionContainer(catalog); 
     container.ComposeParts(this); 

Ecco il codice alla classe per ciascuna delle parti MEF:

[Export(typeof(IFolderItemsViewExtension)) 
public partial class TaskTreeView : DevExpress.XtraEditors.XtraUserControl, IFolderItemsViewExtension, IPartImportsSatisfiedNotification] 

Ecco l'Importa utilizzato nella maschera principale:

[ImportMany(AllowRecomposition = true)] 
    private IEnumerable<IFolderItemsViewExtension> TaskViewExtensions = null; 

Se annullo l'ultima riga Catalog.Catalogs.Add, genera l'eccezione. Se lo eseguo senza che funzioni bene. Quella riga carica un controllo utente diverso che implementa l'Interfaccia IFolderItemsViewExtension. Ho provato a caricare un progetto fittizio che tutto ciò che ha è il controllo utente e quell'interfaccia e ho ancora la stessa eccezione. Non importa quello che faccio, ottengo comunque questa eccezione.

Sembra che tutto vada bene fino a quando non carico più di uno dello stesso tipo di esportazione parte MEF.

Si sta utilizzando l'ultima versione di 2009.22.10.0 di System.ComponentModel.Composistion dal download MEF.

risposta

4

L'errore indica che non è possibile trovare un'esportazione di tipo IFolderViewExtension. Nota che questo è diverso dall'importazione di IFolderItemsViewExtension che hai mostrato.

La mia ipotesi è che il problema non è che hai più IFolderItemsViewExtensions, ma che hai più IFolderViewExtensions, o c'è qualche altro contratto che hai più di uno di quello che stai usando con un'importazione che ne richiede esattamente uno.

Ciò può essere causato dal fatto che si ha lo stesso assembly in più di uno dei cataloghi di directory. È facile che ciò avvenga se si ha un riferimento a un assieme e la copia locale è impostata su true.

+1

Daniel probabilmente si trova qui; non dimenticare che esistono dei metodi aster per eseguire il debug dei problemi MEF piuttosto che tentativi ed errori. Probabilmente dovresti scaricare lo stato della composizione come descritto qui http://mef.codeplex.com/wikipage?title=Debugging%20and%20Diagnostics&referringTitle=Guide –

+0

Grazie per l'aiuto. Ho iniziato a rimuovere le importazioni dai controlli che erano essi stessi esportati e tutto funziona. Inserisco nuovamente le importazioni e ora non riesco a riprodurre il problema originale per cominciare. In conclusione, però ... funziona ora. Grazie Daniele e Nicola. Sono appena tornato in piedi sulla MEF e sono molto sconvolto dalla sua potenza e potenziale per le applicazioni completamente estensibili sul desktop. – user120985

+0

Grazie mille ... ho risolto il mio problema –

0

Suppongo che potrebbe avere più di una dichiarazione di esportazione nella classe di esportazione. Stavo affrontando lo stesso problema e questo si è risolto quando ho rimosso tutte le altre istruzioni di esperti da quella classe di esportazione. e ora sta funzionando bene.

Problemi correlati