2009-12-28 15 views
7

Tengo una aplicación de escritorio Winforms que está cargando varias piezas MEF con el mismo tipo de interfaz.No se pueden cargar varias piezas MEF

Problema: Cuando intento cargar más de uno del mismo tipo me sale el siguiente excepción:

La composición se mantiene sin cambios. Los cambios fueron rechazados debido a los siguientes errores: la composición produjo un solo error de composición. La causa raíz se proporciona a continuación. Revise la propiedad CompositionException.Errors para obtener información más detallada.

1) No se encontraron exportaciones válidos que coincide con la restricción '((exportDefinition.ContractName = "BOCA.TaskPilot.Common.Extensions.IFolderViewExtension") & & (exportDefinition.Metadata.ContainsKey ("ExportTypeIdentity") & & " BOCA.TaskPilot.Common.Extensions.IFolderViewExtension ".Equals (exportDefinition.Metadata.get_Item (" ExportTypeIdentity ")))) ', es posible que se hayan rechazado las exportaciones no válidas.

Como resultado: No se puede establecer la importación 'TaskPilot.Windows.MainForm.FolderViewExtension (ContractName = "BOCA.TaskPilot.Common.Extensions.IFolderViewExtension")' en la parte 'TaskPilot.Windows.MainForm'. Elemento: TaskPilot.Windows.MainForm.FolderViewExtension (ContractName = "BOCA.TaskPilot.Common.Extensions.IFolderViewExtension") -> TaskPilot.Windows.MainForm

Aquí está el código para cargar las piezas:

  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); 

Aquí está el código de la clase para cada una de las partes del MEF:

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

Aquí está la importación utilizados en el formulario principal:

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

Si elimino el comentario de la última línea de Catalog.Catalogs.Add arroja la excepción. Si lo ejecuto sin eso funciona bien. Esa línea carga un control de usuario diferente que implementa la interfaz IFolderItemsViewExtension. Intenté simplemente cargar un proyecto falso que todo lo que tiene es el control del usuario y esa interfaz, y aún recibo la misma excepción. No importa lo que haga, aún recibo esta excepción.

Parece que todo funciona bien siempre y cuando no estoy de cargar más de uno del mismo tipo de pieza de exportación MEF.

Se trata de utilizar la última versión del 2009.22.10.0 del System.ComponentModel.Composistion de la descarga MEF.

Respuesta

4

El error indica que no puede encontrar una exportación de tipo IFolderViewExtension. Tenga en cuenta que esto es diferente de la importación de IFolderItemsViewExtension que ha mostrado.

Supongo que el problema no es que tenga múltiples IFolderItemsViewExtensions, sino que tiene varias IFolderViewExtensions, o hay otro contrato que tiene más de uno de los que está utilizando con una importación que requiere exactamente uno.

Esto puede ser causado porque tiene el mismo conjunto en más de uno de sus catálogos de directorio. Es fácil que esto suceda si tiene una referencia a un ensamblaje y la copia local está establecida en verdadero.

+1

Daniel es probablemente un lugar aquí; no olvide que hay formas más avanzadas para depurar problemas MEF que prueba y error. Probablemente deberías volcar el estado de composición como se describe aquí http://mef.codeplex.com/wikipage?title=Debugging%20and%20Diagnostics&referringTitle=Guide –

+0

Gracias por la ayuda. Empecé a eliminar las Importaciones de los controles que ellos mismos exportaban y todo funciona. Volví a colocar las importaciones y ahora no puedo reproducir el problema original. En resumidas cuentas ... funciona ahora. Gracias Daniel y Nicholas. Ahora estoy obteniendo la mejor semana en MEF y estoy impresionado por su poder y potencial para aplicaciones totalmente extensibles en el escritorio. – user120985

+0

Muchas gracias ... resolvió mi problema –

0

Supongo que podría tener más de un estado de exportación en su clase de exportación. Estaba enfrentando el mismo problema y esto se resolvió cuando eliminé todos los demás enunciados expertos de esa clase de exportación. y ahora está funcionando bien.

Cuestiones relacionadas